728x90
오늘은 if문을 이용하여 어셈블리어를 분석해보겠습니다.
사용한 코드는 다음과 같습니다.
#include <stdio.h>
int main() {
printf("Start\n");
int a = 0;
if (a) {
printf("True");
}
else
printf("False");
return 0;
}
So 간단~
이것을 그래프 형태로 먼저 보게되면,
박스별로 분석을 해보겠습니다.
왕초보니 한줄한줄 해석하겠습니다.
(1번박스)
; Attributes: bp-based frame fpd=0F0h
; int __cdecl main(int argc, const char **argv, const char **envp) main proc near
var_EC= dword ptr -0ECh
push rbp // rdp를 push
push rdi // rdi를 push
sub rsp, 108h // rsp = rsp - 108h
lea rbp, [rsp+20h] // rbp = rsp + 20h의 주소값
mov rdi, rsp // rdi = rsp(rsp-108h)
mov ecx, 42h ; 'B' // ecx = 42h
mov eax, 0CCCCCCCCh // eax = 0CCCCCCCCh
rep stosd // ???
lea rcx, unk_140021003 // rcx = unk_140021003
call j___CheckForDebuggerJustMyCode
////////////////////////////////////////위까지가 #include <stdio.h>와 int mian()으로 예상
lea rcx, Format ; "Start\n" // rcx = Start\n
call j_printf // printf 호출
mov [rbp+0F0h+var_EC], 0 // rbp+0F0h+var_EC = 0 // a = 0;
cmp [rbp+0F0h+var_EC], 0 // rbp+0F0h+var_EC 와 0을 비교 // if안에있는 값을 1(참) 과 비교?
jz short loc_140011881 // 값이 Flase(0)면 loc_120011881로 jump, 아니면 계속 진향
(2번박스) - 참일경우
lea rcx, aTrue ; "True" // rcx = True
call j_printf // printf 호출
jmp short loc_14001188D // 다음 주소로 JUMP
(3번박스) - 거짓인 경우
loc_140011881:
lea rcx, aFalse ; "False" // rcs = False
call j_printf // printf 호출
(4번박스) - return 0;
loc_14001188D:
xor eax, eax // eax = 0
lea rsp, [rbp+0E8h] // rsp = rbp + 0E8h
pop rdi // pop rdi
pop rbp // pop rbp
retn
main endp
위 예제의 if문 핵심 어셈블리어는
mov [rbp+0F0h+var_EC], 0
cmp [rbp+0F0h+var_EC], 0
jz short loc_140011881
이 부분으로 추정됩니다.
예제가 더 필요해보입니다. 추가로 작성해보겠습니다.
혹시나 잘못된 부분이 있다면 알려주세요!!
728x90
'고흐의 연구실 > etc..' 카테고리의 다른 글
[회고] 스파르타 코딩클럽 파이썬 혼자놀기 패키지 완료! (0) | 2020.10.11 |
---|---|
[Reversing] 리버싱 기초 어셈블리어 알아보기(계속 작성중) (0) | 2020.10.01 |
[웹 해킹] CSRF 공격 총정리! (0) | 2020.09.07 |
[웹 해킹] DVWA 설치 및 사용법(작성중) (0) | 2020.09.05 |
[Hadoop] wordcount 실습하기(초간단) (0) | 2020.08.12 |