RCE 初探
UPX
upx == 加壳?
代码压缩器,执行时解码后运行
PS .\upx.exe -1 -o notepad_upx.exe D:\RCE\notepad.exe
段寄存器 16 位
DS 存放数据段的段基址
每一个内存单元的宽度为8位
。
[编号]称为地址。
内存单元:字节 每个字节有个编号
,称为内存地址
dword ptr [esi+13000]=[notepad.01014000]=14D L’ō’
ds 寄存器没用?
在栈中设置硬件断点 找到解壳后的OEP
具体在PUSHAD
中设置硬件断点,指令完成后才暂停 ,也就是POPAD
完成后暂停 ,后面JMP跳转到OEP
original EP
exe默认00400000
dll 默认10000000
节对齐
Alignment is a rounded up value.
Section data size is rounded up for effeciency because the OS moves stuff around in chunks anyway.
The File Alignment is usually 512 bytes which fit the blocksize of most filesystems.
The Section Alignment is usually 4096 bytes which fit the size of a memory page.
So if you have a PE-file with a section (like “.text”) that contains 513
bytes of data:
不足的改为整数倍
Section .text will be rounded up to 1024
bytes on file.
Section .text will be rounded up to 4096
bytes in memory.
Note the amount of slack space possible both on file and in memory.
stud_pe
修改size of optional header值,向文件头插入解码代码
在选项头和节区头间插入代码
numberofRVAandSIZES表示data_directory结构体元素个数(有些没用,可以覆盖)
inline patch 内嵌补丁
将补丁代码放在空白块中
变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。
取地址符&
.text 的 size of raw data == 400 virtual size == 280 文件中400 加载到内存中只加了280
其他值时0x00
image_scn_men_write 相应内存区的写权限
rep movsb 命令
b==byte rep == repeats ECX 里大小 循环
moves 命令
== ds:esi -> ds:edi
decreasing CX, so at the end CX becomes zero.
RCE经验
1 压缩器解码
2 区域双重加密 内嵌补丁
test 按位与
test eax, eax
eax==0 zf 设位1
Ret相当于 Pop EIP
DLL注入
threadProc 线程创建函数
用句柄控制相应进程
三种方法:
创建远程线程
钩子注入
设置里全局注入
SPaCIoS