[英]Understanding/decoding obscure assembly code
像我之前的問題一樣,這涉及到一個分配,其中調用了一個方法,該方法需要一定的密碼,代碼被隱藏,我們必須從匯編代碼中推斷出密碼(我想避免點擊。我已經完成了幾個階段,所以到目前為止,我的理解能力有所提高,但是此階段存在一些問題,到目前為止,我知道該階段的密碼是兩個整數,回溯一直是我使用其中一些方法的轉到方法,但並不是很對這個階段很有幫助。
其他任何了解正在發生的事情以及我應該如何弄清楚輸入內容的幫助都將是有幫助的,我已經嘗試將其轉換回C代碼,就像之前的階段一樣
0x00000000004010b4 <phase_5+0>: sub $0x18,%rsp 0x00000000004010b8 <phase_5+4>: lea 0x10(%rsp),%rcx 0x00000000004010bd <phase_5+9>: lea 0x14(%rsp),%rdx 0x00000000004010c2 <phase_5+14>: mov $0x4026aa,%esi 0x00000000004010c7 <phase_5+19>: mov $0x0,%eax 0x00000000004010cc <phase_5+24>: callq 0x400b80<sscanf@plt> 0x00000000004010d1 <phase_5+29>: cmp $0x1,%eax 0x00000000004010d4 <phase_5+32>: jg 0x4010db<phase_5+39> 0x00000000004010d6 <phase_5+34>: callq 0x401421(explode_bomb) 0x00000000004010db <phase_5+39>: mov 0x14(%rsp),%eax 0x00000000004010df <phase_5+43>: and $0xf,%eax 0x00000000004010e2 <phase_5+46>: mov %eax,0x14(%rsp) 0x00000000004010e6 <phase_5+50>: cmp $0xf,%eax 0x00000000004010e9 <phase_5+53>: je 0x40111b <phase_5+103> 0x00000000004010eb <phase_5+55>: mov $0x0,%edx 0x00000000004010f0 <phase_5+60>: mov $0x0,%ecx 0x00000000004010f5 <phase_5+65>: add $0x1,%edx 0x00000000004010f8 <phase_5+68>: cltq 0x00000000004010fa <phase_5+70>: mov 0x402600(,%rax,4),%eax 0x0000000000401101 <phase_5+77>: add %eax,%ecx 0x0000000000401103 <phase_5+79>: cmp $0xf,%eax 0x0000000000401106 <phase_5+82>: jne 0x4010f5 <phase_5+65> 0x0000000000401108 <phase_5+84>: movl $0xf,0x14(%rsp) 0x0000000000401110 <phase_5+92>: cmp $0xf,%edx 0x0000000000401113 <phase_5+95>: jne 0x40111b <phase_5+103> 0x0000000000401115 <phase_5+97>: cmp %ecx,0x10(%rsp) 0x0000000000401119 <phase_5+101>: je 0x401120 <phase_5+108> 0x000000000040111b <phase_5+103>: callq 0x401421 <explode_bomb> 0x0000000000401120 <phase_5+108>: add $0x18,%rsp 0x0000000000401124 <phase_5+112>: retq
代碼轉換為:
0x402600: int table[15];
0x4026aa: const char *format;
void func (const char *str)
{
int a, b, count, sum;
if (sscanf (str, format, &a, &b) != 2) {
explode_bomb();
}
a = a & 0xF;
if (a == 0xF) {
explode_bomb();
}
sum = 0;
count = 0;
while (a != 0xF) {
a = table[a];
sum += a;
count++;
}
if ((count != 0xF) || (sum != b)) {
explode_bomb ();
}
}
要回答您的具體觀點:
cltq用於清除rax的4個最高有效字節,以免干擾以下指令中的地址計算。 它對計算沒有影響。
mov 0x402600(,%rax,4),%eax <-這行到底是做什么的? 空白讓我失望,空白= 0?
是的,這只是mov word eax,[0x402600 + 0 + rax * 4]
一旦有了C等效項,就很容易弄清楚如何找到解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.