x86动态链接原理

第一步:在二进制文件编译完成后,二进制文件的PLT表在0x80482b0处,留出了一个指向GOT表的0x80496f8指针。由于编译完成后PLT的值无法修改,所以在动态链接时,链接器将动态库的真实逻辑地址填到GOT表,使得程序在真正运行时,可以找到每次运行都随机分配内存位置的动态库。

[ctfs.me] reverse me 0x01

第一次做正经的CTF练习,花了点时间做这道逆向,记录一下。

下载下来是一个压缩包,解压有两个文件: reverseme-x86和reverseme-x86_64,为了省事就做reverseme-x86了。

用file看了一眼

reverseme-x86: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamical......

第一次正确逆向

小记一下第一次成功的逆向,eshard培训作业ARE-4中获取key程序的序列号。

练习目标是通过使用panda-re工具(QEMU的套件),通过查找QEMU中寄存器状态,获得输入字符匹配时,PC指针的值,顺着找到代码中的程序行,接着找到程序验证序列号的代码,逆向后破解。

具体过程:

0x00 下载编译panda-re

根据官方repo可以在Ubuntu 16.04上轻松的编译成功。不......

linker的奥秘

逆向做linker的注入,非常有意思。

linker是在程序运行的时候,在OS层面上链接程序所需动态库的程序,C程序通常由GLIBC在/usr/lib或/lib下的ld.so担当。一个通常的,基于Linux x64架构的程序,file abc的信息会是

abc: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamica......

printf打印格式的谜题

在做逆向作业的时候遇到一个问题:把从内存读回的数据用

char a[1000]

LOOP

printf("%x",a);

的方式输出到屏幕,再转储成二进制的话,总会出现数据丢失的情况。由于输出文件是一个MP3文件,一旦有数据丢失就意味着文件结构破坏,无法解析。

后来发现使用

LOOP

printf("%c",a);

的方式打印,直接......

缓冲区溢出笔记(二)

尝试复现Bypassing ASLR – Part I中的实验,在Kali x64和Ubuntu 16.04.2 x64上均失败,在nebula live CD(Ubuntu 11.10 x86)上完全成功(连偏移地址都完全一致,代码直接复制使用)。作者使用的是Ubuntu 12.04 x86环境,因此符合预期。

脆弱代码:

#include <stdio.h>

#includ......

跨网段的谜题

路由上俩虚拟网段:

192.168.3.0/24,网关192.168.3.1

192.168.10.0/24,网关192.168.10.1

两个网段互通,因此机器之间可以相互ping通。

然而在192.168.3.76的机器上以桥接方式假设的虚拟机(192.168.3.57),却无法被192.168.10.11的机器ping通。反之,192.168.3.57也无法ping通任何在192.1......

缓冲区溢出笔记(一)

缓冲区溢出的基础前提,在于可以通过控制strcpy()或strcat()甚至printf(),来覆盖堆栈里的返回地址。之前的实验里,其实只实现了最简单的溢出方式,即跳转的地址在当前程序栈(text segment)内,也就是只能执行程序内存在的功能,攻击的效果有限。更普遍的堆栈溢出攻击,应该是能够任意代码执行,也就意味着能够调用自定的攻击函数。

严格说来,溢出跳转应包含几个层次:

跳转目标......

'