미친해커

[HackCTF] Pwnable : Basic_BOF #2 본문

Hacking/HackCTF

[HackCTF] Pwnable : Basic_BOF #2

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

문제 이름을 보아 Buffer OverFlow 문제로 예상된다.

우선 바이너리를 다운받아 IDA Pro 로 디스어셈블을 해보자

 

코드를 보면 변수 s와 함수 포인터 v5가 선언되어 있다. s는 배열인것으로 보인다. 그리고 v5에 sup라는 함수의 주소를 넣고 fgets를 이용해 s에 133(0x85)바이트 만큼 입력을 받은 후 v5에 들어있는 함수를 실행한다.

s의 공간은 0x8C - 0xC = 0x80 총 128 바이트이다. s부터 +129 바이트부터는 v5의 데이터가 들어가 있다. fgets에서 133 바이트를 s에 입력받으니 Buffer OverFlow가 발생돼 v5의 데이터를 덮어쓸 수 있다. 그렇다면 v5의 데이터를 덮어씌어 실행되는 함수를 다른함수로 조작하여 flag를 얻어낼 수 있을 것으로 보인다.

이번 문제에서는 sup라고 하는 사용자 정의 함수가 등장했다. IDA의 Functions window를 확인해보면 현재 바이너리에서 사용하는 함수들을 확인 할 수 있다.

 

위 함수들을 보면 눈에 띄는 함수 3개를 확인할 수 있다. 각각의 함수를 디스어셈블을 시켜보면 다음과 같은 코드를 확인 할 수 있다.

 

왼쪽은 sup, 오른쪽은 shell 함수이다

 

sup 함수는 변수 s를 출력한다.

shell 함수는 Shell을 띄워준다. 그렇다면 main에서 Buffer OverFlow를 발생시켜 v5의 들어있는 함수를 shell로 덮어쓰면 shell 함수가 실행되면서 Shell을 따낼 수 있다.

 

 

shell 함수의 주소는 gdb의 print 기능을 이용 또는 IDA의 Functions window 에서 확인할 수 있다.

# file : bof_basic2.py
from pwn import *

#p = process('./bof_basic2')
p = remote('ctf.j0n9hyun.xyz', 3001)

payload = 'A' * 0x80 + p32(0x0804849b)

p.sendline(payload)
p.interactive()

payload는 128 (0x80) 바이트를 채우고 뒤에 shell 함수의 주소를 패킹하여 붙여준다. 그러면 v5에 있는 함수가 shell 함수로 바뀌어 실행되면서 Shell이 얻어지고 flag를 얻을 수 있게된다.

 

 

반응형
Comments