180828 逆向-网鼎杯(3-2)

这篇博客讲述了在网鼎杯比赛中遇到的一个逆向分析问题,涉及到Windows和Linux下如何脱壳。作者详细解释了如何利用/proc/pid/mem在Linux下dump内存,并探讨了程序中的alarm函数和ptrace反调试技术。此外,还介绍了如何通过LD_PRELOAD来绕过ptrace限制。在解决Python pyc文件解密问题时,作者分享了两种不同的pyc解析方法,并提供了解析脚本,通过正则替换和在线反编译得到了源码。
摘要由CSDN通过智能技术生成

I_like_pack

IDA加载一看啥都没有,再根据题目名显然是个壳
windows下脱壳相对而言麻烦一些,ExeInfoPe查壳啊、各种壳的针对性操作啊啥的
Linux下一方面系统开源随便魔改,另一方面有一个/proc/pid/mem的文件可以直接读取进程的内存,使得dump极为容易

本题放到系统下跑起来后发现如果输入会回显“NO”,而不输入的话大概三秒就会自动结束
这显然是alarm函数的功劳

如果仅是alarm函数的话,其实可以比拼一下手速,毕竟三秒钟还算在人类的反应速度内,另一方面也可以通过sh脚本来执行dump
试了一下cat /proc/pid/mem会报错,在这里有官方的说明,提供了三种方法
1. 获取maps,根据模块地址来读取程序的内存
2. open mem以后attach目标进程使其暂停,然后即可读
3. gcore pid

尝试了一下,其中第一种方法可以直接使用–因为只是读取mem文件
通过这个脚本

#! /usr/bin/env python
import re
maps_file = open("/proc/self/maps", 'r')
mem_file = open("/proc/self/mem", 'r', 0)
for line in maps_file.readlines():  # for each mapped region
    m = re.match(r'([0-9A-Fa-f]+)-([0-9A-Fa-f]+) ([-r])', line)
    if m.group(3) == 'r':  # if this is a readable region
        start = int(m.group(1), 16)
        end = int(m.group(2), 16)
        mem_file.seek(start)  # seek to region start
        chunk = mem_file.read(end - start)  # read region contents
        print chunk,  # dump contents to standard output
maps_file.close()
mem_file.close()

操作方法如下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值