【问题标题】:Compare string without calling function in assembly?比较字符串而不在程序集中调用函数?
【发布时间】:2020-02-18 15:40:10
【问题描述】:

假设我有两个字符串,我想比较字符串但不想为truefalse 调用另一个函数:

mov rsi, 0x4141414141414141
mov rdi, 0x6161616161616161
cmp rsi, rdi
// if true do here
// otherwise do here
// jmp back_up_to_cmp rsi, rdi

我遇到的问题是,我不能调用一个函数来判断真假。那么,有什么办法可以达到我的期望吗?

【问题讨论】:

  • 你试过条件跳转吗?
  • @fuz well jmp 必须是 jmp to_function 这是我不想要的。
  • 不,您可以jne 到当前函数内的标签。看看编译器如何实现if。请参阅 comparing string without using jmp in assembly? 上的 cmets,其中有类似的混淆点。
  • @Noobx 我想我不太了解您的限制。我对回答这样的问题并不感兴趣,因为一旦我写了答案,限制列表往往会突然出现新条目。
  • 可以在shellcode中使用相对分支;它们与位置无关comparing string without using jmp in assembly? 的完全相同的副本(但只有 cmets 的答案)

标签: assembly nasm


【解决方案1】:

正如@fuz 所指出的,我可以使用相对跳转来实现我想要的:

工作完整代码:

SECTION .text
global main

main:
mov rax, 1
mov rsi, 0x203e7475706e49
push rsi
mov rsi, rsp
mov rdx, 7
syscall

mov rax, 0
mov rdi, 0
mov rsi, rsp
mov rdx, 256
syscall

mov rax, 1
mov rsi, rsp

xor rdx, rdx
cmp byte [rsi + rdx], 0x0a
jz 0xc
inc rdx
jmp -0xe

syscall

mov rax, 60
syscall

我查看了我的cmp 所在的位置,计算了差异并使用jmp 跳转到该位置:

0x0000000000001130 <+0>:     mov    $0x1,%eax
0x0000000000001135 <+5>:     movabs $0x203e7475706e49,%rsi
0x000000000000113f <+15>:    push   %rsi
0x0000000000001140 <+16>:    mov    %rsp,%rsi
0x0000000000001143 <+19>:    mov    $0x7,%edx
0x0000000000001148 <+24>:    syscall 
0x000000000000114a <+26>:    mov    $0x0,%eax
0x000000000000114f <+31>:    mov    $0x0,%edi
0x0000000000001154 <+36>:    mov    %rsp,%rsi
0x0000000000001157 <+39>:    mov    $0x100,%edx
0x000000000000115c <+44>:    syscall 
0x000000000000115e <+46>:    mov    $0x1,%eax
0x0000000000001163 <+51>:    mov    %rsp,%rsi
0x0000000000001166 <+54>:    xor    %rdx,%rdx
0x0000000000001169 <+57>:    cmpb   $0xa,(%rsi,%rdx,1)
0x000000000000116d <+61>:    je     0x117b <main+75>
0x0000000000001173 <+67>:    inc    %rdx
0x0000000000001176 <+70>:    jmpq   0x1169 <main+57>
0x000000000000117b <+75>:    syscall 
0x000000000000117d <+77>:    mov    $0x3c,%eax
0x0000000000001182 <+82>:    syscall 
0x0000000000001184 <+84>:    nopw   %cs:0x0(%rax,%rax,1)
0x000000000000118e <+94>:    xchg   %ax,%ax

所以没有更多功能了 :) 谢谢@fuz

【讨论】:

  • 您可以简单地使用标签。无需手动计算这些地址。
  • @fuz,我很抱歉有点不懂组装,那么,标签有操作码吗?它可以在shellcode中使用吗?
  • 标签只是内存位置的名称。标签不会生成任何代码,它们只是一个方便的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
相关资源
最近更新 更多