Hacking/Reversing
[Whois 정보보안교육] Reversing Hand-Ray 과제
chipkkang
2021. 10. 13. 20:44
어셈블리 명령어 정리
명령어 | 사용법 | 의미 | 예시 |
mov | mov A, B; | B의 값을 A에 넣어라. | mov rax, rbx; mov DWORD[rax], ebx; |
lea | lea A, B; | B의 주소값을 A에 넣어라. | lea rax, [ebx]; |
add | add A, B; | A의 값을 B만큼 증가하라. | add ecx, 0x10; add BYTE[rbx], al; |
sub | sub A, B; | A의 값을 B만큼 감소하라. | sub ecx, 0x10; sub BYTE[rbx], al; |
inc | inc A; | A의 값을 1만큼 증가시켜라. | inc rax; |
dec | dec A; | A의 값을 1만큼 감소시켜라. | dec rbx; |
xor | xor A, B; | A와 B를 XOR한 값을 A에 저장하라. | xor rax, rax; |
and | and A, B; | A와 B를 AND한 값을 A에 저장하라. | and rax, rbx; |
or | or A, B; | A와 B를 OR한 값을 A에 저장하라. | or rax, rbx; |
cmp | cmp A, B; | A와 B를 비교하라. | cmp rax, rbx; |
jmp | jmp A | rip의 값을 A로 설정하라. | jmp 0xdeadbeef; |
call | call A; | A를 호출한다. | call 0xdeadbeaf; |
push | push A; | A의 값을 스택에 넣어라. (WORD 단위) | push rax; |
pop | pop A; | 스택에서 하나의 WORD를 뽑아, A에 넣어라. | pop rax; |
ret | ret; | 함수 끝나서 돌아갈 때. | Ret; |
cdq | cdq | edx 레지스터의 값이 0x0으로 셋팅한다. | cdq |
imul | imul A, B, C; | B와 C의 곱을 A에 저장한다. | imul esi, edi, 25; |
rep | rep; | ecx 레지스터에 담긴 카운터 횟수만큼 반복한다. | rep stos dward ptr [edi]; |
Q1.
push ebp mov ebp,esp sub esp,0x10 mov DWORD PTR [ebp-0x4],0xa mov eax,DWORD PTR [ebp-0x4] mov DWORD PTR [ebp-0x8],eax mov eax,DWORD PTR [ebp-0x8] imul eax,eax,0x17 mov DWORD PTR [ebp-0x8],eax mov eax,DWORD PTR [ebp-0x8] sub eax,DWORD PTR [ebp-0x4] mov DWORD PTR [ebp-0xc],eax mov eax,DWORD PTR [ebp-0xc] cdq idiv DWORD PTR [ebp-0x4] mov DWORD PTR [ebp-0x4],eax mov eax,0x0 leave ret |
int A = 10, B; B = A; B *= 0x17; // 23 (10진수) B -= A; int C; C = B; C /= A; A = B; B = 0x0; return; |
Q2.
push ebp; mov ebp,esp; sub esp,0x3fc; mov DWORD PTR [ebp-0x400],0x0; lea edx,[ebp-0x3fc]; mov eax,0x0; mov ecx,0xf9; mov edi,edx; rep stos DWORD PTR es:[edi],eax; lea eax,[ebp-0x400]; mov DWORD PTR [eax],0x6c6c6548; mov DWORD PTR [eax+0x4],0x6f57206f; mov DWORD PTR [eax+0x8],0x21646c72; mov DWORD PTR [eax+0xc],0x4f48570a; mov DWORD PTR [eax+0x10],0x4a205349; mov DWORD PTR [eax+0x14],0x474e414a; mov WORD PTR [eax+0x18],0x217e; mov BYTE PTR [eax+0x1a],0x0; sub esp,0xc; lea eax,[ebp-0x400]; push eax; call 0x8049030; add esp,0x10; mov eax,0x0; leave; ret; |
int A = 0; // ebp-0x400 == A // edx = &ebp-0x3fc // eax = 0x0, ecx = 0xf9, edi = edx; // eax = &ebp-0x400 A = 0x6c6c6548; *[A + 0x4] = 0x6f57206f; *[A + 0x8] = 0x21646c72; *[A + 0xc] = 0x4f48570a; *[A + 0x10] = 0x4a205349; *[A + 0x14] = 0x474e414a; *[A + 0x18] = 0x217e; (Word는 2byte 크기) *[A +0x1a] = 0x0; (BYTE는 1byte 크기) // esp -= 0xc, eax = &ebp-0x400 puts(); // esp += 0x10; // eax = 0x0; return 0; |