Tag: 逆向工程

试图对一个函数进行逆向工程

我试图更多地了解x86中的汇编。 我在这里有一个神秘的function,我知道返回一个int并接受一个int参数。 所以它看起来像int mystery(int n){} 。 但我无法弄清楚C中的function。 该组件是: mov %edi, %eax lea 0x0(,%rdi, 8), %edi sub %eax, %edi add $0x4, %edi callq repz retq mov %edi, %eax shr %eax and $0x1, %edi and %edi, %eax retq 我不明白lea在这里做了什么以及它可能是什么样的function。

将非ASCII字符写入tty上的程序员的stdin(通过ssh)

我被SSH连接到一个带有一些二进制挑战的远程服务器。 有一次它要求我输入文字。 我知道它正在使用fgets()来读取stdin ,并且我可以溢出它被复制到的地方并覆盖附近的变量。 问题是我不知道如何键入我需要的地址值, \x84和\x04等。如果我能够使用bash我会echo -ne “\x84″或使用Chex数组但我可以’在这里做那种事。 我尝试使用hex到ASCII转换器并复制二进制字符,并使用expect脚本发送二进制值,但两者都有相同的问题。 x84添加了额外的字符,x04根本不会写入。 任何想法是可靠地将值写入内存的最佳方法,这些内容在Unix tty上通过ssh无法用ASCII字符表示?

从编译器asm输出反向设计数组维度/结构布局?

在此代码中,A和B是使用#define定义的常量。 A和B的值是多少? typedef struct { int x[A][B]; long y; } str1; typedef struct { char array[B]; int t; short S[A]; long u; } str2; void setVal(str1 *p, str2 *q) { long v1 = q->t; long v2 = q->u; p->y = v1+v2; } 为setVal过程生成以下汇编代码: setVal: movslq 8(%rsi), %rax addq 32(%rsi), %rax movq %rax, 184(%rdi) ret

用调试信息反编译C代码?

Java和Python字节代码比C / C ++编译器生成的编译机器代码相对容易反编译。 我无法找到一个令人信服的答案,为什么来自-g选项的信息不足以进行反编译,但足以进行调试? Python / Java字节代码中包含的额外内容是什么,这使得反编译变得容易?

gcc是否在编译时重新排序局部变量?

我现在正在阅读(第二次)“黑客:剥削的艺术”并且偶然发现了一些事情。 本书提出了两种不同的方法来利用这两个类似的程序: auth_overflow和auth_overflow2 在第一个中,有一个像这样的密码检查function int check_authentication(char *password) { int auth_flag = 0; char password_buffer[16]; strcpy(password_buffer, password); … } 输入超过16个ASCII字符会将auth_flag的值更改为大于0的值,从而绕过检查,如此gdb输出所示: gdb$ x/12x $esp 0xbffff400: 0xffffffff 0x0000002f 0xb7e0fd24 0x41414141 0xbffff410: 0x41414141 0x41414141 0x41414141 0x00000001 0xbffff420: 0x00000002 0xbffff4f4 0xbffff448 0x08048556 password_buffer @ 0xbffff40c auth_flag @ 0xbffff41c 第二个程序反转了两个变量: int check_authentication(char *password) { char password_buffer[16]; int auth_flag = 0; strcpy(password_buffer, […]

为什么在调试时初始化函数中的字符串不像int那样工作

所以我今天尝试调试一些简单的C程序; 第一个是 int main(){ int a ,b ; return 0 ; } 在解编的时候给了我什么 push ebp mov ebp,esp sub esp,008h 因为我需要有8个字节来存储当前堆栈帧中的a和b,因为它们是局部变量! 但是当我尝试同样的字符串说 int main() { char greeting[12] = “Pwnit2Ownit”; return 0; } 在解编的时候给了我什么 push ebp mov ebp,esp sub esp,0DCh 0DCh是220,但由于字符串只有12个字节长不应该 sub esp,0DCh 是 sub esp,00ch 相反? 任何人都可以分享关于如何将字符串存储在内存中以及稍后通过汇编[优先指令]访问的链接,如果它的长度很大,那么存储在内存中的字符串问候因为我们无法将所有内容存储在堆栈中

_malloc在assembly中到底做了什么?

public main main proc near push ebp mov ebp, esp and esp, 0FFFFFFF0h sub esp, 30h mov dword ptr [esp], 8 ; size call _malloc mov [esp+2Ch], eax mov dword ptr [esp+4], 4 mov eax, [esp+2Ch] mov [esp], eax call __start 上面的代码代表了我正在处理的大型项目的一部分。 我试图将此代码转换为C等效,但我很难理解malloc的工作原理。 我估计8个字节将是被分配的内存的大小; 但是,我不确定这条线。 mov eax, [esp+2ch] malloc对eax做了什么? 那么这是等效的C代码吗? int main(void) { int *ptr1; […]

新创建的暂停进程的EIP仅在Windows XP上失败 – 在kernal32.dll映像下的EIP?

我的程序在Windows Vista Ultimate和Windows 7上运行完美,但在Windows XP上运行失败。 首先,我的应用程序创建一个系统文件的进程,它调用GetThreadContext(remote_thread)并将LPVOID值设置为值context-> Eip,然后检查从VirtualQueryEx设置的结构MEMORY_BASIC_INFORMATION中的值。 以下是VirtualQueryEx在调用时返回的值: Windows XP 0 – 分配基础 0 – 分配保护 2088828928 – 基地址 1 – 保护 983040 – 地区大小 65536 – 状态 0 – 类型 Windows 7的 2003959808 – 分配基础 128 – 分配保护 2004025344 – 基地址 32 – 保护 876544 – 区域大小 4096 – 国家 16777216 – 类型 Windows […]

写蹦床function

我已设法覆盖内存中函数的前几个字节,并将其绕过我自己的函数。 我现在遇到创建蹦床function以将控制反弹回真实function的问题。 这是我的问题的第二部分。 BYTE *buf = (BYTE*)VirtualAlloc(buf, 12, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); void (*ptr)(void) = (void (*)(void))buf; vm_t* VM_Create( const char *module, intptr_t (*systemCalls)(intptr_t *), vmInterpret_t interpret ) { MessageBox(NULL, L”Oh Snap! VM_Create Hooked!”, L”Success!”, MB_OK); ptr(); return NULL;//control should never get this far } void Hook_VM_Create(void) { DWORD dwBackup; VirtualProtect((void*)0x00477C3E, 7, PAGE_EXECUTE_READWRITE, &dwBackup); //save […]

逆向工程c程序

如果分发了这个二进制文件,则每个c程序都转换为机器代码。 由于计算机的指令集众所周知,是否可以取回C原始程序?