gpt4 book ai didi

c - 理解和翻译汇编代码

转载 作者:行者123 更新时间:2023-11-30 16:21:18 26 4
gpt4 key购买 nike

简单介绍一下背景。我是 c 和汇编代码的初学者,我们有一个“炸弹”分配(用 c 编写),它调用需要某些密码的方法,但代码不可见,我需要通过查看汇编代码来确定正确的密码.

代码表明此方法的密码是 6 个数字,该密码作为“输入”传递到方法阶段 2(我试图避免触发)。

我无法理解这里发生的事情,所以如果有人可以帮助我将其翻译成 C 代码,或者如果我需要查看任何特定的寄存器/位置,那将会有很大帮助。还有 4 个阶段,每个阶段都应该更复杂,因此我想更好地理解如何阅读这些阶段。

此外,如果有人拥有带有汇编代码关键字的良好资源(例如可打印的表格),这也会很有帮助,而且如果 32 位和 64 位寄存器之间存在任何差异,我需要担心的除了注册名称..

(gdb) disas
Dump of assembler code for function phase_2:
0x0000000000400f49 <+0>: push %rbp
0x0000000000400f4a <+1>: push %rbx
0x0000000000400f4b <+2>: sub $0x28,%rsp
0x0000000000400f4f <+6>: mov %fs:0x28,%rax
0x0000000000400f58 <+15>: mov %rax,0x18(%rsp)
0x0000000000400f5d <+20>: xor %eax,%eax
0x0000000000400f5f <+22>: mov %rsp,%rsi
0x0000000000400f62 <+25>: callq 0x401708 <read_six_numbers>
0x0000000000400f67 <+30>: cmpl $0x0,(%rsp)
0x0000000000400f6b <+34>: jne 0x400f74 <phase_2+43>
0x0000000000400f6d <+36>: cmpl $0x1,0x4(%rsp)
0x0000000000400f72 <+41>: je 0x400f79 <phase_2+48>
0x0000000000400f74 <+43>: callq 0x4016d2 <explode_bomb>
0x0000000000400f79 <+48>: mov %rsp,%rbx
0x0000000000400f7c <+51>: lea 0x10(%rsp),%rbp
0x0000000000400f81 <+56>: mov 0x4(%rbx),%eax
0x0000000000400f84 <+59>: add (%rbx),%eax
0x0000000000400f86 <+61>: cmp %eax,0x8(%rbx)
0x0000000000400f89 <+64>: je 0x400f90 <phase_2+71>
=> 0x0000000000400f8b <+66>: callq 0x4016d2 <explode_bomb>
0x0000000000400f90 <+71>: add $0x4,%rbx
0x0000000000400f94 <+75>: cmp %rbp,%rbx
0x0000000000400f97 <+78>: jne 0x400f81 <phase_2+56>
0x0000000000400f99 <+80>: mov 0x18(%rsp),%rax
0x0000000000400f9e <+85>: xor %fs:0x28,%rax
0x0000000000400fa7 <+94>: je 0x400fae <phase_2+101>
0x0000000000400fa9 <+96>: callq 0x400b90 <__stack_chk_fail@plt>
0x0000000000400fae <+101>: add $0x28,%rsp
0x0000000000400fb2 <+105>: pop %rbx
0x0000000000400fb3 <+106>: pop %rbp
0x0000000000400fb4 <+107>: retq
End of assembler dump.

最佳答案

您的程序集与此等效,请参阅phase_2函数

#include <stdio.h>

__attribute__((noinline)) void read_six_numbers(void *xxx, int *num)
{
num[0] = 0;
num[1] = 1;
num[2] = 1;
num[3] = 2;
num[4] = 3;
num[5] = 5;
}


__attribute__((noinline)) void explode_bomb()
{
printf("explode_bomb.\n");
}

void phase_2(void *xxx)
{
int num[6];
int i;

read_six_numbers(xxx, num);

if (num[0] != 0 || num[1] != 1)
explode_bomb();

for (i = 0; i < 4; i++) {
if (num[i] + num[i + 1] == num[i + 2])
continue;

explode_bomb();
}
}

int main()
{
phase_2(NULL);
return 0;
}

关于c - 理解和翻译汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54938838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com