如标题所述.我尝试使用Bindingflags但它们似乎都没有工作:
Assembly assembly = Assembly.LoadFile(somePath);
foreach (var type in assembly.GetTypes())
{
foreach(var method in type.GetMethods())
Console.WriteLine(method.Name);
}
Run Code Online (Sandbox Code Playgroud) 我想将CS(代码段)和IP(指令指针)地址存储到任何可用的寄存器AX,BX,CX或DX中.是否有可能以某种方式访问当前的CS或IP值?
我正在对OllyDbg中的应用程序进行一些内联修改,并注意到一些奇怪的行为.
这些是我写的指令,直接从调试器复制:
2005FE35 4C DEC ESP
2005FE36 77 21 JA SHORT 2005FE59 ; 23 byte difference
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,我只修改了操作码(4C 77 21); 其他一切都由OllyDbg自动解释,这就是我的困惑.该指令应该递减ESP寄存器,然后执行21个十六进制字节的条件跳转.但是,地址0x2005FE59和0x2005FE36之间的差异不是21 - 它是23!
使用21个十六进制字节值,我观察到看似不稳定的结果.
2005FE36 77 20 JA SHORT 2005FE58 ; 22 byte difference
2005FE36 77 19 JA SHORT 2005FE51 ; 1B byte difference
2005FE36 77 17 JA SHORT 2005FE4F ; 19 byte difference
Run Code Online (Sandbox Code Playgroud)
我指示向前跳转的十六进制字节数与地址偏移量不匹配; 它似乎永远都是2.
这里发生了什么?
有没有一种简单的方法可以让这个NASM代码段工作?
add ebx, byte [ebp-10+ecx]
我收到以下错误:error: mismatch in operand sizes.我想将内存地址[ebp-10+ecx]中的字节添加到ebx的最低有效字节.当然,ebx是一个4或8字节的寄存器,会导致错误.
我正在尝试解决这个问题:
假设您在eax,ebx,ecx中获得了值.编写在所有寄存器中添加值的代码,并将最终结果存储在edx中.
我的代码:
mov eax,3
mov ebx,4
mov ecx,1
add edx,eax
add edx,ebx
add edx,ecx
Run Code Online (Sandbox Code Playgroud)
我是否必须初始化寄存器edx(mov edx,0)?
我编译了一个基本的漏洞利用(基本上,C中的源代码没有任何用处,只需执行执行Bash的操作码).问题是当我执行二进制文件时:"分段错误".
在这里我做了什么:
executeBash.asm(NASM)
section .text
global _start
_start:
xor EAX, EAX ; EAX = 0
push EAX ; "\0\0\0\0"
push DWORD 0x68732F2F ; "//sh"
push DWORD 0x6E69622F ; "/bin"
mov EBX, ESP ; arg1 = "/bin//sh\0"
push EAX ; NULL -> args[1]
push EBX ; "/bin//sh\0" -> args[0]
mov ECX, ESP ; arg2 = args[]
mov AL, 0X0B ; syscall 11
int 0x80 ; excve("/bin//sh", args["/bin//sh", NULL], NULL)
Run Code Online (Sandbox Code Playgroud)
在终端:
prompt$ nasm -f elf32 executeBash.asm
prompt$ ld -m elf_i386 executeBash.o -o …Run Code Online (Sandbox Code Playgroud) .model small
.stack 100h
.Data
count word 0
.code
main proc
mov cx,5
mov al,40h
mov ah,2
mov bx,0
first :
mov count,cx
inc bx
inc al
mov cx,bx
second :
mov dl,al
int 21h
loop second
mov cx ,count
mov dx,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
loop first
mov ax,4c00h
int 21h
main endp
end main
Run Code Online (Sandbox Code Playgroud)
我写了这段代码并期待像这样的输出
一个
BB
CCC
DDDD
EEEEE
但得到这个输出
一个
00
000
0000
00000
任何人都可以解决这个代码中的问题,当我删除行代码行提供输出
ABBCCCDDDDEEEE
我的CS课程中有一个以缓冲区溢出攻击为中心的项目.
我很难完全理解这个话题.
说我有以下功能:
08048cc5 <getbuf>:
8048cc5: 55 push %ebp
8048cc6: 89 e5 mov %esp,%ebp
8048cc8: 83 ec 38 sub $0x38,%esp
8048ccb: 8d 45 d8 lea -0x28(%ebp),%eax
8048cce: 89 04 24 mov %eax,(%esp)
8048cd1: e8 32 01 00 00 call 8048e08 <Gets>
8048cd6: b8 01 00 00 00 mov $0x1,%eax
8048cdb: c9 leave
8048cdc: c3 ret
Run Code Online (Sandbox Code Playgroud)
目前它返回此功能:
08048c53 <test>:
8048c53: 55 push %ebp
8048c54: 89 e5 mov %esp,%ebp
8048c56: 83 ec 28 sub $0x28,%esp
8048c59: e8 63 04 00 00 call …Run Code Online (Sandbox Code Playgroud) 我有这个 32 位代码:
unsigned long long load(volatile unsigned long long *target) {
unsigned long long result;
__asm__ __volatile__
(
"movl %%ecx, %%edx\n\t"
"movl %%ebx, %%eax\n\t"
"lock cmpxchg8b %0\n\t"
"movl %%edx, 4%1\n\t"
"movl %%eax, %1\n\t"
: "+m" (*target)
: "o" (result)
: "eax", "ebx", "ecx", "edx", "memory", "cc"
);
return result;
}
Run Code Online (Sandbox Code Playgroud)
当使用 gcc 5.3 版本编译时,代码的尾部会生成以下汇编代码(为了清晰起见,稍作编辑):
lock cmpxchg8b (%esi)
movl %edx, 48(%esp)
movl %eax, 8(%esp)
movl 8(%esp), %eax
movl 12(%esp), %edx
Run Code Online (Sandbox Code Playgroud)
调用的结果cmpxchg8b位于 EDX:EAX 中。生成的代码将 EDX 存储在 48(%esp),从 12(%esp) 重新加载 …
我在 Visual Studio IDE 的调试器上从 C++ 构建中获得了以下反汇编代码:
根据我在movss指令上看到的内容,应该是
因此,虽然前 3 个字节很容易理解,但我不太理解其余的字节,例如05 6b 02 10 00第一行、44 24 38第二行等等。
你能帮我理解它们吗?05或44好像是/r?这是什么意思?
assembly ×9
x86 ×7
c ×2
gcc ×2
buffer ×1
c# ×1
constructor ×1
disassembly ×1
dos ×1
linux ×1
machine-code ×1
nasm ×1
ollydbg ×1
reflection ×1
tasm ×1
x86-16 ×1
x86-64 ×1