본문 바로가기
hacking/pwnable

[Dream hack] cmd_center

by ilp 2024. 9. 4.
반응형

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

 

cmd_center

Description IP를 확인할 필요가 없습니다! 혹시 다른 명령어는 못쓰나요? 다른 명령어를 사용했다면 플래그를 획득하세요! References https://dreamhack.io/learn/2/1#3 https://dreamhack.io/learn/2/14#3

dreamhack.io



먼저 문제 코드를 본다.

일단 init 부분은 크게 중요하지 않으니 넘어간다.

(입출력 속도 관련된것 같은데 핵심기능은 아닌것 같다.)

 

그리고 먼저 실행을 해본다.

뭘 입력해도 특별한 행동이 없다.

코드를 봐보면 center_name에 입력받는데 그걸가지고 실제 돌아가는 코드는 없다.

(와우 이럴거면 왜 만들었는지 모르겠다. 하지만 좋은 취야점)

 

자 이걸 보면 버퍼 오버프로우 cmd_ip의 값 수정이 가능해 보인다.

마침 read도 100byte 까지 읽는다. (너무 맛있어 보인다.)

 

다음으로 먼저

gdb ./cmd_center
로 gdb 시작해주고

gdb에서 break 포인트 설정하고 돌려준다.

그리고 어셈블리어로 봐본다.

딲 이 부분에 모든게 들어 잇따.

 

일단 read 부분을 본다. center_name두번쨰 인자값이기 때문에 rsi 이다.

근대 이 rsi 라는 놈에 rax를 넣어 줬는데 그러면 rax의 주소center_name의 주소가 된다.

그럼 0x130이 주소가 된다.

(두번쨰 인자값이 rsi인 이유는 따로 설명할거다. 궁금하면  64bit 함수 호출 규약 || System V AMD64 ABI 규약 을 검색 해 보자 System V AMD64 ABI 규약 이 더 포괄적이다.)

 

이번에는 cmd_id의 주소를 찾아보자

이부분에 나와 있는데

여기서 cmd_ip는 첫번쨰 인자값이기 때문에 rdi이다. (아까 말했듯이 궁금하면 검색해보자)

rdi는 rax를 넣어줬고 rax의 주소는 0x110 이므로

0x110이 주소가 된다.

 

그럼 이제 0x20 만큼 차이가 난다. (두 변수가 메모리 주소가 0x20 만큼 떨어져 있다)

0x130 - 0x110 = 0x20

 

이쯤에서 익스플로잇 코드를 작성을 시작한다.

일단 접속해주고

페이로드를 작성한다.

앞에 0x20만큼 c를 넣어서 center_name을 넘어서 cmd_ip 값을 바꿔 줄거다

그리고 나성 이제 Command Injection을 쓴다.

command injection 도 별거 없다.

 

👇 이거는 드림핵에서 따온 것인데 

라고 한다. 그러면 우리는 ';'를 사용해서 ifconfig;/bin/sh를 cmd_ip에 채워줄수 있다.

그 이후에 마지막으로 페이로드를 전송하면 끝난다.

 

전체 코드

from pwn import *

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

chuu=b'c'*0x20+ b'ifconfig;/bin/sh'

p.sendafter(b'Center name: ',chuu)

p.interactive()
더보기

DH{f4c11bf9ea5a1df24175ee4d11da0d16}


반응형