역공학, 역설계
만들어진 장치가 어떻게 작동하는지 분석을 통해 원리를 이해하는 과정
소스코드 -> 실행파일

기계어와 1대1 대응된다 저급함
mov rax,17
rax 에 17을 대입
64비트기준
어셈블리: MOV RAX, 116진수
기계어: 48 C7 C0 01 00 00 00
(몇비트 연산인지 접두어) (명령) (레지스터) (숫자)
초고속 저장공간
메모리에서 값을 가져와 사용한다
https://www.youtube.com/watch?v=5SICv-2tMgQ&t=1s
수행한 연산 결과를 기록한다
http://ref.x86asm.net/coder64.html
프로그램이 커널에 자원을 요청하는 행위
레지스터에 인자를 저장한 후 호출한다
- rax : 호출할 기능
- rdi : 파라미터 1
- rsi : 2
- rdx : 3
section .data
a dq (계산할 숫자) ;저장받을 공간
b dq (계산할 숫자)
section .text
global _start
_start:
mov r8, [a] ; 더하는거
add r8, [b]
mov rdi, r8
call print
mov r8, [a] ;빼는거
sub r8, [b]
mov rdi, r8
call print
mov r8, [a] ;곱
imul r8, [b]
mov rdi, r8
call print
mov rax, [a] ;나눗셈
cqo ;나눌때 쓰레기값 안나오게 128비트로 확장
idiv qword [b]
mov r8, rax
mov rdi, r8
call print
mov rax, 60 ;종료
xor rdi, rdi
syscall
print:
sub rsp, 32 ;버퍼 만듦
mov rax, rdi
lea rsi, [rsp + 31]
mov byte [rsi], 10
mov rcx, 1
mov rbx, 10
.convert:
xor rdx, rdx ;자릿수 하나하나 문자로 바꿔서 버펀에 넣는다
div rbx
add dl, '0'
dec rsi
mov [rsi], dl
inc rcx
cmp rax, 0
jne .convert
mov rax, 1 ;출력
mov rdi, 1
mov rdx, rcx
syscall ; write(1, rsi, rcx)
add rsp, 32 ;버퍼 정리정돈
ret ;돌아가
문제 풀이를 완료하고 클래스룸을 확인하니 풀이가 아니라 코드 해석 정리라는 것을 깨달았습니다.
아쉬운 대로 둘 다 때려 넣었습니다.
빈약한 내용 정리 죄송합니다.

; int __fastcall main(int argc, const char **argv, const char **envp)
main proc near
var_118= byte ptr -118h
var_18= qword ptr -18h
; __unwind { // __GSHandlerCheck
push rdi ;스택 공간확보
sub rsp, 130h
mov rax, cs:__security_cookie ;오버플로우 막는거라함
xor rax, rsp
mov [rsp+138h+var_18], rax
lea rax, [rsp+138h+var_118] ;0으로 초기화
mov rdi, rax
xor eax, eax
mov ecx, 100h
rep stosb
lea rcx, aInput ; "Input : " ;Input : 출력
call sub_140001190
lea rdx, [rsp+138h+var_118] ;입력받음
lea rcx, a256s ; "%256s"
call sub_1400011F0
lea rcx, [rsp+138h+var_118] ;확인함
call sub_140001000
test eax, eax
jz short loc_140001166
맞으면 Correct 틀리면 wrong을 출력하나 보다
call sub_140001000이 부분을 주목하자
뭔가 비교하는 함수를 호출하는 것 같다
함수를 확인해보자

lea rdx, Str2 ; "([DH]에 의해 제거됨)"hmmm...

.rdata:0000000140002220 Str2 db '([DH]에 의해 제거됨)',0hmm...

