这题比较简单了,主要就是考察你会不会用gdb
int __cdecl main(int argc, const char **argv, const char **envp)
{
char buf[32]; // [rsp+0h] [rbp-50h] BYREF
char src[44]; // [rsp+20h] [rbp-30h] BYREF
unsigned int seed; // [rsp+4Ch] [rbp-4h]
setbuf(stdin, 0LL);
setbuf(stderr, 0LL);
setbuf(stdout, 0LL);
puts("GDB-pwndbg maybe useful");
strcpy(src, "Ayaka_nbbbbbbbbbbbbbbbbb_pluss");
strcpy(buff, src);
seed = 1;
srand(1u);
enccrypt(buff);
read(0, buf, 0x1EuLL);
if ( strncmp(buff, buf, 0x1EuLL) )
{
puts("Oh No!You lose!!!");
exit(0);
}
return system("/bin/sh");
}
根据反编译后的代码可知只要满足buff=buf就可以getshell
首先我想到的是buff加密前的值是“Ayaka_nbbbbbbbbbbbbbbbbb_pluss”,直接根据加密函数加密后得到密文就行了,仔细观察可以看到加密过程中使用了随机数种子,伪加密,随机数种子给了,那就可以直接得到密文:
b'r@\x0e\xdc\xaaxF\x14\xe2\xb0~L\x1a\xe8\xb6\x84R\xee\xbc\x8aX&\xf4\xc2\x90^,\xcb\xc8\x00\x00'
但是无法直接输入,所以还是要借用pwntools
这里我们也可以用另一种方法,既然要比较buff和buf的内容,那我们可以直接根据buff的地址获取到加密后密文的存储地址
根据IDA可得buff的地址为0x404100
打开gdb进行调试:
在puts和read处设置断点
得到密文的存储地址
编写exp如下:
from pwn import *
p = remote("node5.anna.nssctf.cn",28395)
payload = p64(0x144678aadc0e4072) + p64(0x84b6e81a4c7eb0e2) + p64(0xf426588abcee2052) + p64(0x0000c8cb2c5e90c2)
p.sendlineafter("GDB-pwndbg maybe useful",payload)
print(payload)
p.interactive()
gdb调试命令还是不熟(哭)