use*_*712 5 c assembly pointers opcodes shellcode
在shellcode教程中,我看到了以下示例:
main(){
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
想法是创建一个exit() - 系统调用.那么,他们生产组件:
Section .text
global _start
_start:
mov ebx, 0
mov eax, 1
int 0x80
Run Code Online (Sandbox Code Playgroud)
我理解这一点.0是我们存储在ebx中的exit()的参数,1是退出系统调用的编号,使用0x80我们将CPU更改为内核模式并执行系统调用.
之后,他们让我们生成以下代码:
bb 00 00 00 00
b8 01 00 00 00
cd 80
Run Code Online (Sandbox Code Playgroud)
然后,他们将其翻译成C语言,看起来像:
char example[] = "\xbb\x00\x00\x00\x00"
"\xb8\x01\x00\x00\x00"
"\xcd\x80"
int main(){
int *pointer;
pointer = (int *)&pointer+2;
(*pointer) = (int)example;
}
Run Code Online (Sandbox Code Playgroud)
所以,我理解的是他们将操作码放在char数组中,但我不明白他们在main()中做了什么 - 方法.第一行还可以.但他们想用第2和第3行表达什么?
最好的祝福,
该代码获取堆栈变量的地址,然后获取其上方两个指针大小的地址。然后,该位置的任何内容都将被 shellcode 的地址覆盖。
如果覆盖的位置是函数的返回地址,那么当函数退出时,shellcode将被执行。实验和反汇编可以帮助计算从局部变量到返回地址的正确偏移量。
通常,实际的利用将涉及堆栈缓冲区溢出(即,一个函数不检查其放入堆栈缓冲区中的内容的长度,从而允许其“溢出”到返回地址):缓冲区可能被填充shellcode 和“溢出”部分将包含缓冲区的地址;这样,当函数退出时,它将执行缓冲区内的 shellcode。
| 归档时间: |
|
| 查看次数: |
774 次 |
| 最近记录: |