Assembly 汇编学习(1)

汇编学习(1)

环境:Windows 11,WSL2(Ubuntu),MINGW-GCC,NASM

一早上起来发现系统自动更新Win11了,用起来还算不错。

NASM,MINGW32-w64都是在WSL 2上的,点击这里看 MINGW32-w64在WSL 2上的安装方法。(Windows变成Linux发行版指日可待= =)

NASM与MINGW GCC

test.asm

1
2
3
4
5
6
7
8
9
10
11
    global do_something
section .text
do_something:
push rbp
mov rbp, rsp
xor eax, eax
mov eax, ecx
add eax, eax
mov rsp, rbp
pop rbp
ret

使用NASM生成OBJ文件:

1
$ nasm -f win64 -o test.obj test.asm

编写C文件

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

extern int do_something(int);

int main(int argc, char const *argv[])
{
int a = do_something(10);
printf("%d\n", a);
return 0;
}

使用MINGW32-w64-gcc链接,生成可执行文件:

1
$ w64gcc test.c test.obj -o test.exe

用IDA Pro分析test.exe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
; Attributes: bp-based frame

; int __cdecl main(int argc, const char **argv, const char **envp)
public main
main proc near

var_4= dword ptr -4
arg_0= dword ptr 10h
arg_8= qword ptr 18h

push rbp
mov rbp, rsp
sub rsp, 30h
mov [rbp+arg_0], ecx
mov [rbp+arg_8], rdx
call __main
mov ecx, 0Ah
call do_something
mov [rbp+var_4], eax
mov eax, [rbp+var_4]
mov edx, eax
lea rcx, Format ; "%d\n"
call printf
mov eax, 0
add rsp, 30h
pop rbp
retn
main endp

IDA Pro中的do_something函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
; Attributes: bp-based frame

public do_something
do_something proc near
push rbp
mov rbp, rsp
xor eax, eax
mov eax, ecx
add eax, eax
mov rsp, rbp
pop rbp
retn
do_something endp

很明显,这里do_something函数是fastcall。函数的调用规则不知道怎么修改,谷歌、SO查了好多也不行= =,等我再去看看吧。

这算是认真研究汇编的一个开始吧,且行且珍惜。