pwnable 4번 문제인 내 버퍼가 흘러넘친다!!! 이다.

 

이름이랑 뭔가 입력을 받는다.

prob1를 한번 보자.

 

딱히 적용된 보호기법은 없다.

 

main문에서 name에 read로 0x32만큼 입력을 받는다.

그리고 다시 s에 gets로 입력을 받는다.

NX-bit가 적용되어 있지 않으니 name에 쉘코드를 입력하고, s에 BOF를 일으켜 name을 실행할 수 있을 것 같다.

name의 주소를 확인해보자.

 

0x0804A060이다.

즉 처음 입력에 0x32 크기보다 작은 쉘코드를 넣고, s에서 0x14 + 4(sfp)만큼 더미값으로 덮은 뒤 s의 ret을 name의 주소 0x0804A060로 덮어써서 BOF가 일어나도록 할 수 있을 것이다.

익스코드를 짜보자.

 

쉘코드는 25byte 짜리를 가져다 썼다.

실행을 해보면..

 

성공적으로 익스플로잇이 된다.

'HackCTF > Pwnable' 카테고리의 다른 글

[HackCTF] Pwnable - x64 Simple_size_BOF  (0) 2020.07.08
[HackCTF] Pwnable - x64 Buffer Overflow  (0) 2020.07.08
[HackCTF] Pwnable - Basic_FSB  (0) 2020.07.03
[HackCTF] Pwnable - Basic_BOF #2  (0) 2020.06.25
[HackCTF] Pwnable - Basic_BOF #1  (0) 2020.06.25

pwnable 3번 문제인 Basic_FSB 이다.

 

대충 입력받고 그 내용 그대로 출력하는 프로그램인가보다.

파일을 뜯어보자.

 

딱히 보호기법은 적용된게 없다.

 

main문에서 바로 vuln함수를 실행

 

흠..1024만큼 s에 입력을 때려박는다.

그리고 format에 1024만큼 s의 값을 출력하고, 그 값을 출력하는것을 리턴시킨다.

한번 서식문자를 입력에 때려박아봤다.

 

두번째 서식문자부터 출력되는 것을 볼 수 있다.

즉, 앞쪽 값으로 printf@got 주소를 쓰고, 더미값을 채우고 뭔가 쉘을 주는 함수를 넣고 %x로 출력..하면 될거라 생각했지만 값을 입력받는 사이즈를 보니 %n과 같은 입력값 사이즈를 출력하는 서식문자로 처리하는게 좋을 것 같았다.

자, 이제 쉘을 줄 다른 함수를 찾아봤다.

 

함수들을 보니 뭔가 flag가 있다.

 

쉘을 준다.

자 이제 우리는 printf@got함수와 flag의 함수가 필요합니다.

자 그러면 우리가 이제 해야할일

 

1. payload에 리틀엔디안으로 printf@got의 주소 0x804A00C을 넣는다.

2. 그리고 이제 아까 생각한대로 %n을 통해 flag의 주소를 넣을 건데, 그말은 즉 첫번째 인자로 인식되는 값이 0x80485B4이여야합니다.

3. 0x80485B4=134514100‬(10), 즉 첫번째 인자의 길이를 134514100‬로 주고 두번째 인자로 %n을 줘야한다.

4. 우리가 맨 처음에 printf@got의 주소를 넣었으니 4바이트를 빼주어야한다.

5. 134514100‬ - 4 = 134514096

6. 즉 payload는 "\x0C\xA0\x04\x08" + "%134514096x" + "%n"

 

좋아 익스코드를 짜보자.

 

처음 풀어보는 포맷 스트링 버그를 이용한 문제였다.

재밌고만

 

반찬이 마음에 든다.

성공적으로 익스플로잇이 된다.

Pwnable 2번 문제인 Basic_BOF #2 이다.

 

?

음 파일을 보자.

 

32bit ELF 파일

 

NX-bit가 적용되어 있다.

IDA로 한번 코드를 보자.

 

s에 133만큼 입력을 받고, v5를 함수로 실행할 수 있다.

쉘코드를 쓰지 못하니 내장되어있는 함수를 사용해야하는데, 함수 목록에 shell이라는것이 보인다.

 

쉘을 주는 함수가 정의되어 있다.

즉, s에서 BOF를 시켜, v5의 값을 shell함수의 주소로 덮어쓰면 될 것이다.

 

shell함수의 주소는 0x0804849b

 

s는  ebp-8Ch, v5는 ebp-Ch이므로 0x8C-0xC, 128만큼 더미값으로 덮어쓰면 v5에 값을 덮어쓸 수 있을 것이다.

128만큼 더미값을 쓰고, 리틀엔디안으로 shell함수의 주소를 써주면 될 것 같다.

p32와 p64라는 좋은 명령어를 알았다.

자동으로 리틀엔디안형태로 바꿔준다는 듯 하다.

 

성공적으로 익스플로잇이 된다.

+ Recent posts