BruceFan's Blog

Stay hungry, stay foolish

0%

前几天通过从网上查阅相关资料,大体了解了一些Android无源码调试的方法,本文主要总结无源码调试的三种方法:

  • smalidea + Android Studio
  • IDA
  • 插桩(Instrumentation)
阅读全文 »

什么是Rootkit

简单地说,rootkit是一种能够隐身的恶意程序,也就是说,当它进行恶意活动的时候,操作系统根本感觉不到它的存在。想象一下,一个程序能够潜入到当前操作系统中,并且能够主动在进程列表中隐藏病毒,或者替换日志文件输出,或者两者兼而有之——那它就能有效地清除自身存在的证据了。此外,它还可以从受保护的内存区域中操纵系统调用,或将接口上的数据包导出到另一个接口。本文将重点介绍如何通过hooking系统调用来进行这些活动。在本文的第一部分,我们将自定义一个系统调用,然后构造一个hook到这个系统调用上的rootkit。在最后一部分,我们将创建一个rootkit来隐藏我们选择的进程。

阅读全文 »

练习的题目是Exploit Exercises Protostar上的堆栈题目,在树莓派上编译进行练习。
socat把可执行文件绑定到6666端口。

1
$ socat tcp-listen:6666,fork exec:./stack0
阅读全文 »

这篇文章是参考UC Berkeley张超博士的一个视频和两篇NDSS论文,学习的一些关于C++虚函数安全相关的内容。
虚函数调用是面向对象中的一个很重要的特性,用来支持多态。运行时实际调用的函数是根据对象来决定的。运行时找虚函数是通过vtable函数指针来实现,vtable指针由编译器添加到对象中。

阅读全文 »

本文介绍通过return-to-dl-resolve的手法绕过NX和ASLR的限制。
这里构造一个存在栈缓冲区漏洞的程序,以方便后续构造ROP链。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void vuln()
{
char buf[100];
setbuf(stdin, buf);
read(0, buf, 256);
}
int main()
{
char buf[100] = "Welcome to XDCTF2015~!\n";

setbuf(stdout, buf);
write(1, buf, strlen(buf));
vuln();
return 0;
}
阅读全文 »

本文以一个简单C++例子进行介绍。

示例代码编译时没有使用RTTI,也没有使用异常机制
下文中的样例在x86平台上测试
所有二进制文件已经被strip了
大多数虚函数的实现细节都没有标准化,并且不同编译器之间可能会有所不一样。因此,我们将专注于GCC的行为。

大多数情况下,没有办法让一个虚函数的调用,变换为一个对非虚函数的调用(反虚拟化)。因为,需要的信息在静态编译中是不全的,只有在运行时才会存在。因此,逆向虚函数时,目标是判断哪些函数会在特定的情况下被调用。后面会学习其他技巧,来进一步缩小范围。

阅读全文 »

先介绍一下IDAPython的简单用法:写一个获取函数引用的功能,只需要XrefsTo()这个API函数,脚本如下:

1
2
3
def find_func_xrefs(addr):
for addr in XrefsTo(addr, flags=0):
print hex(addr.frm)
阅读全文 »

类的基本思想是数据抽象封装。数据抽象是一种依赖于接口实现分离的编程技术。
面向对象程序设计的核心思想是数据抽象继承动态绑定
定义基类

阅读全文 »

下载
漏洞点在new_package的时候会有nullbyte off-by-one,通过伪造prev_size和in_use位来达到chunk overlapping。
下图是漏洞点的位置,在new_package函数里。

阅读全文 »

字符设备驱动结构

cdev结构体

Linux内核中cdev结构体描述一个字符设备。

1
2
3
4
5
6
7
8
struct cdev {
struct kobject kobj; // 内嵌的kobject对象
struct module *owner; // 所属模块
struct file_operations *ops; // 文件操作结构体
struct list_head list;
dev_t dev; // 设备号
unsigned int count;
}
阅读全文 »