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