문제 소스코드입니다.
어셈블리어와 익숙해지기 위해 gdb로 모든 코드를 분석 해 보았습니다.
분석을 토대로 중요한 부분만 캡쳐해서 올리겠습니다.
두번째 if문을 보겠습니다.
0x0804865b <+64>: push 0x5 0x0804865d <+66>: push 0x804880d 0x08048662 <+71>: lea eax,[ebp-0x80] 0x08048665 <+74>: push eax 0x08048666 <+75>: call 0x8048510
0x0804866b <+80>: add esp,0xc 0x0804866e <+83>: test eax,eax 0x08048670 <+85>: jne 0x80486be <main+163> 0x08048672 <+87>: push 0x4 0x08048674 <+89>: call 0x80484a0 <malloc@plt> 0x08048679 <+94>: add esp,0x4 0x0804867c <+97>: mov ds:0x804a068,eax 0x08048681 <+102>: mov eax,ds:0x804a068 0x08048686 <+107>: push 0x4 0x08048688 <+109>: push 0x0 0x0804868a <+111>: push eax 0x0804868b <+112>: call 0x8048500 <memset@plt> 0x08048690 <+117>: add esp,0xc 0x08048693 <+120>: lea eax,[ebp-0x80] 0x08048696 <+123>: add eax,0x5 0x08048699 <+126>: push eax 0x0804869a <+127>: call 0x80484e0 <strlen@plt> 0x0804869f <+132>: add esp,0x4 0x080486a2 <+135>: cmp eax,0x1e 0x080486a5 <+138>: ja 0x80486be <main+163> 0x080486a7 <+140>: mov eax,ds:0x804a068 0x080486ac <+145>: mov edx,eax 0x080486ae <+147>: lea eax,[ebp-0x80] 0x080486b1 <+150>: add eax,0x5 0x080486b4 <+153>: push eax 0x080486b5 <+154>: push edx 0x080486b6 <+155>: call 0x8048490 <strcpy@plt>
$ebp-0x80은 line[128]의 시작주소를 가리킵니다.
main+140 에서 0x804a068은 auth->name의 주소가 들어갑니다.
그리고 네번째 if문을 보면
0x080486e0 <+197>: add esp,0x4 0x080486e3 <+200>: push 0x6 0x080486e5 <+202>: push 0x8048819 0x080486ea <+207>: lea eax,[ebp-0x80] 0x080486ed <+210>: push eax 0x080486ee <+211>: call 0x8048510 <strncmp@plt> 0x080486f3 <+216>: add esp,0xc 0x080486f6 <+219>: test eax,eax 0x080486f8 <+221>: jne 0x804870e <main+243> 0x080486fa <+223>: lea eax,[ebp-0x80] 0x080486fd <+226>: add eax,0x7 0x08048700 <+229>: push eax 0x08048701 <+230>: call 0x8048470 <strdup@plt> 0x08048706 <+235>: add esp,0x4 0x08048709 <+238>: mov ds:0x804a06c,eax
입력된 $ebp-0x80에서 "service" 문자열 다음에 들어오는 값들을 strdup함수를 통해 포인터로 할당해줍니다. 그 값은 0x804a06c에 들어갑니다.
그리고 마지막 if문에서 else로 가지 않고 if조건을 만족시키는 방법을 보겠습니다.
0x0804870e <+243>: push 0x5 0x08048710 <+245>: push 0x8048821 0x08048715 <+250>: lea eax,[ebp-0x80] 0x08048718 <+253>: push eax 0x08048719 <+254>: call 0x8048510 <strncmp@plt> 0x0804871e <+259>: add esp,0xc 0x08048721 <+262>: test eax,eax 0x08048723 <+264>: jne 0x804875a <main+319>
0x08048725 <+266>: mov eax,ds:0x804a068 0x0804872a <+271>: mov eax,DWORD PTR [eax+0x20] 0x0804872d <+274>: test eax,eax 0x0804872f <+276>: je 0x804874d <main+306> 0x08048731 <+278>: push 0x8048827 0x08048736 <+283>: call 0x80484b0 <puts@plt> 0x0804873b <+288>: add esp,0x4 0x0804873e <+291>: push 0x8048843 0x08048743 <+296>: call 0x80484c0 <system@plt>
main+266을 보면 0x804a068의 값을 $eax에 넣습니다.
(gdb) x/4x 0x804a068 0x804a068: 0x0804b008 0x0804b018 0x00000000 0x00000000
즉 $eax에는 0x804b008이 들어가게 되고 auth->auth 값이 있냐 없냐에 따라 분기문을 통해 결과가 나옵니다.
$eax+0x20은 0x804b028입니다. 이곳에 값을 넣어 주면 문제가 클리어 됩니다.
(gdb) x/10x 0x804b008 0x804b008: 0x41414141 0x0000000a 0x00000000 0x00000019 0x804b018: 0x41414120 0x41414141 0x41414141 0x41414141 0x804b028: 0x00000a41 0x00020fd9
strdup에 의해 생성되는 service 영역은 0x804b018부터입니다. 파일을 실행하고 input할때 service에서 더미값을 최소 16개를 주면 auth->auth에 값이 오버플로우가 됩니다.
'HACKING > System hacking' 카테고리의 다른 글
CTF pwn 문제용 nc 서버 만들기 (0) | 2018.02.15 |
---|---|
GDB BP에 관한 것 (0) | 2017.11.29 |
heap overflow 문제풀이2 (0) | 2016.11.02 |
heap overflow 문제 풀이 (0) | 2016.11.01 |
BOF 원리와 문제 풀이 (0) | 2016.10.26 |