티스토리 뷰
이 문제는 간단한 bof로 값을 변경하는 문제이다. nc local 서비스 실행과 소켓 통신 오버플로우를 정리하기 위해 라이트 업을 쓴다.
먼저 이 바이너리는 소켓프로그래밍이 되어 있기때문에.
while true; do nc -l -p 1234 -e filename; done
출처: http://s0ngsari.tistory.com/entry/ncnetcat-서버-만들기 [s0ngsari]
를 통해 nc서버를 열어줘야 한다.
실제 CTF에서는 열려있기 때문에 상관이 없다. 나는 따로 푸느라 nc서버를 다시 연 것이다.
최근에는 -e옵션이 없어서 따로 설정을 해줘야 한다.
이렇게 서버를 연 후
nc localhost 31337로 연결을 하면,
다른 오류없이 잘 실행이 된다.
이 문제에는 코드가 제공된다.
그냥 ida로 보겠다.
이 부분이 핵심이다.
참고로 헥스레이를 애용하니깐 gdb를 너무 안쓰는것 같아서 이번에는 제공되는 코드와 gdb로 풀었었다.
Welcome to CSAW CTF. 출력 후 recv로 0x3FC만큼 입력을 받는다.
1020 byte만큼 입력을 받는다. buffer의 크기는 1016이므로 BOF가 발생한다.
문제는 if(backdoor)이 부분이다. backdoor가 참이면 ./key라는 파일을 출력해준다.
gdb 로 분석해보겠다.
스택 프레임은 총 1040(0x410) 만큼 형성이 되어있다.
buffer[1015] = 0;
이 부분을 보면.
buffer[1015]는 bp-0xd 임을 알 수 있다.
if ( backdoor )
이 부분을 보면,
ebp-0xc가 backdoor 변수의 시작임을 알 수 있다.
따라서 메모리 구조는
buffer[1016] | backdoor(4byte) | . . .|
buffer와 backdoor가 dummy없이 이어진다는 것을 알 수 있다.
따라서 1016만큼 A로 채워주고 1을 넣어주면 backdoor는 참이 되어 ./key파일을 출력해준다.( 참고로 key파일은 미리 만들어놨다.)
exploit.py이다.
1 2 3 4 5 6 7 8 9 | from pwn import * s = remote("localhost",31337) s.recv() payload = "A"*1016 payload += p32(1) s.send(payload) s.interactive() | cs |
실행 결과는
flag{hyomin!!!1hart@!}
'pwnable > CTF write-up' 카테고리의 다른 글
[CSAW2013] exploitation-2 write-up (0) | 2018.05.14 |
---|---|
[trustealth]easy write-up (0) | 2018.05.13 |
[Codegate 2018] betting write-up (0) | 2018.05.12 |
[Codegate 2017] babypwn write-up (0) | 2018.01.30 |
[Plaid CTF] ropasaurusrex write-up (0) | 2018.01.29 |
- ebp change
- heap
- hacking
- tcache
- srop
- 본선가고싶다
- fastbindup
- glibc
- stack reusing
- pwable
- rt_sigreturn
- pwnable
- FSB
- exit
- fastbin
- TLS
- HackCTF
- pwnable.tw
- SQLi
- oob
- 해킹
- overflow
- fsop
- codegate
- shellcoding
- Total
- Today
- Yesterday