gpt4 book ai didi

linux - 为什么我无法在自修改代码中单步执行 aeskeygenassist 指令?

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:02 24 4
gpt4 key购买 nike

我尝试使用汇编语言实现aes128加密,我的最终目标是找出最终值。调试(使用单步执行)时,调试器停在 0x8048074 地址处。

这里是代码:

global _start
section .text

_start:

pxor xmm2, xmm2
pxor xmm3, xmm3
mov bx, 0x36e5
mov ah, 0x73

roundloop:
shr ax, 7
div bl
mov byte [sdfsdf+5], ah

sdfsdf:
aeskeygenassist xmm1, xmm0, 0x45
pshufd xmm1, xmm1, 0xff

shuffle:
shufps xmm2, xmm0, 0x10
pxor xmm0, xmm2
xor byte [shuffle+3], 0x9c
js short shuffle

pxor xmm0, xmm1
cmp ah, bh
jz short lastround

aesenc xmm3, xmm0
jmp short roundloop

lastround:
aesenclast xmm3, xmm0
ret

调试器卡在此处,我无法单步0x804807a

[-------------------------------------code-------------------------------------]
0x804806c <_start+12>: mov ah,0x73
0x804806e <roundloop>: shr ax,0x7
0x8048072 <roundloop+4>: div bl
=> 0x8048074 <roundloop+6>: mov BYTE PTR ds:0x804807f,ah
0x804807a <sdfsdf>: aeskeygenassist xmm1,xmm0,0x45
0x8048080 <sdfsdf+6>: pshufd xmm1,xmm1,0xff
0x8048085 <shuffle>: shufps xmm2,xmm0,0x10
0x8048089 <shuffle+4>: pxor xmm0,xmm2

我正在使用peda GDB 插件。

编辑:

抱歉,我没有提到错误消息,错误消息是此指令的段错误mov BYTE PTR ds:0x804807f,ah

最佳答案

我假设您忘记链接 --omagic 以使 .text 部分可写。

<小时/>

所以 mov BYTE PTR ds:0x804807f,ah 出现段错误,并且它位于 aeskeygenassist 之前。程序崩溃后你不能继续单步执行。 (您没有 SIGSEGV 的处理程序,默认操作是终止您的程序)。

当我出于好奇在桌面上尝试此操作时,如果我忽略段错误消息,我可以想象将这种行为解释为单步执行在 aeskeygenassist 之前“卡住”!再次尝试表明“程序不再运行”。

来自 GDB session :

(gdb) layout reg
(gdb) starti # like run with an implicit breakpoint on the first instruction
(gdb) si
0x0000000000401004 in _start ()
0x0000000000401008 in _start () ## I kept pressing return to repeat the command
0x000000000040100c in _start ()
0x000000000040100e in roundloop ()
0x0000000000401012 in roundloop ()
0x0000000000401014 in roundloop () # the MOV store

Program received signal SIGSEGV, Segmentation fault.
0x0000000000401014 in roundloop () # still pointing at the MOV store

请注意,RIP 仍然指向 mov。在您的 32 位版本中为 0x8048074,在我的相同源的 64 位版本中为 0x401014

<小时/>

摘自ld手册:

-N
--omagic
Set the text and data sections to be readable and writable. Also, do not page-align the data segment, and disable linking against shared libraries. If the output format supports Unix style magic numbers, mark the output as "OMAGIC". Note: Although a writable text section is allowed for PE-COFF targets, it does not conform to the format specification published by Microsoft.

如果我链接到以下内容,您的代码对我来说效果很好:

  nasm -felf64 aes.asm &&
ld --omagic aes.o -o aes

或者,您可以进行 mprotect 系统调用以提供包含此代码 PROT_READ|PROT_WRITE|PROT_EXEC 的页面。

GDB 的 layout reg 反汇编窗口甚至会在存储修改 aeskeygenassist 的立即数后更新其反汇编。

<小时/>

另请注意,自修改代码 (SMC) 在现代 x86 上极其缓慢。全pipeline nuke after every store near instructions being executed 。您最好使用汇编器宏展开。

此外,在 Linux 下您无法从 _startret;它不是一个函数。堆栈指针指向 argc,而不是返回地址。 对于 32 位代码,使用 int 0x80 进行 _exit 系统调用。当我说“有效”时,我的意思是它在将 argc 弹出到 RIP 后,从地址 1 获取代码时达到了 ret 并出现段错误。

此外,使用 default rel 进行存储的 RIP 相对寻址;它更紧凑。或者我猜您出于某种原因正在根据您的代码地址构建 32 位可执行文件。起初我没有注意到这一点,这就是我作为 64 位可执行文件进行测试的原因。幸运的是,您正确使用了标签,并且 aeskeygenassist 在两种模式下的长度相同,因此它仍然有效。

关于linux - 为什么我无法在自修改代码中单步执行 aeskeygenassist 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59557183/

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