이번에 또 어셈블리어 읽는 방법으로 돌아왔다 어셈블리어는 읽고 이해하는 것이 중요하다 암튼 많이 읽어보면 술술 익히게 될 것이다 이 블로그에 처음 접하고 어셈블리어를 제대로 알고 싶다면 위 링크 부터 차례로 보고 오는 것을 추천한다
https://noobhack.tistory.com/22
[NOOBHACK] 어셈블리어란
해킹을 배운다면 정말정말 중요한 어셈블리어에 대해 배워보자 일단 어셈블리어란 프로그래밍 언어인데 이게 좀 저급 언어다 언어로서 질이 낮다는게 아니라 프로그래밍 언어 중 고급 언어와
noobhack.tistory.com
https://noobhack.tistory.com/23
[NOOBHACK] 어셈블리어 구동 방식과 명령어
어셈블리어를 입문하는 사람들을 위해 친절하고 링크도 걸어주고 다 할테니까 어셈블리어를 처음 접하는 분이라면 아래 링크에 들어가길 바란다 https://noobhack.tistory.com/22 [NOOBHACK] 어셈블리어란
noobhack.tistory.com
https://noobhack.tistory.com/25
[NOOBHACK] C언어를 어셈블리어로 변환하기
자 어셈블리어는 겁나 어렵고 읽기도 버겁다고 했습니다 하지만 포너블이나 해킹을 위해서는 꼭 필요한 요소로 작용하는데요 그런 어셈블리어를 읽는 방법을 알려주겠습니다 먼저 코드부터 보
noobhack.tistory.com
https://noobhack.tistory.com/26
[NOOBHACK] 어셈블리어 읽는 방법
자 오늘은 어셈블리어를 쉽사리 못 읽는 초보들을 위해 어셈블리어를 쉽게 읽는 방법을 알려주겠다 그전에 내 게시물을 제대로 안 본 사람들이 있다면 전 게시물을 보고 오시길 바랍니다 https://
noobhack.tistory.com
이제 잔말 말고 코드나 보자

메인 코드

abs함수 코드
포너블이나 시스템 해킹을 할 때에는 함수를 많이 많이 사용하니 어셈블리어가 함수를 어떻게 작동하게 하는지 알아볼 필요가 있다 메인 함수부터 차례로 보자

빨간 원을 그린 위에서 부터 아래로 설명하자면
rsp에서 16진수 108h를 빼서 108h만큼 메모리 크기를 할당 받았고
mov dowrd ptr [a],0Ah로 a라는 변수에 0Ah(10)만큼 할당 받았으며
mov라는 명령어에 ecx라는 레지스터에 a라는 값이 들어간다(10)
그리고 call라는 명령어로 abs라는 함수가 실행된다

여기가 abs함수가 위치한 곳이다 먼저 또 위에서 부터 차례로 말해주자면
mov dword ptr [rsp+8],ecx를 받는다 이제 내가 전에 말했던 어셈블리어의 특징이 나왔다
변수명 대신 주소로 변수를 구분한다는 특징이 여기서 나왔다
rsp+8은 abs함수의 a라고 생각 하면 된다
rsp+8에 main 함수에서 mov 명령어로 ecx가 할당 받았던 10를 다시 rsp+8위치에 넣어준다
그러면 그 뒤의 동작은 코드를 시작하기 전 기본적으로 실행하던 코드가 있으니 생략하고 다음 빨간 줄로 간다면
처음 보는 명령어가 있을 것이다 imul이라는 것인데 imul은 음수를 곱할때 사용하는 명령어다
즉 eax라는 레지스터에 dword ptr [a]에 0FFFFFFFFh를 곱한 값을 넣는 것이다 그리고 ret를 통해 코드를 마무리한다
여기서 드는 의문점이 왜 -1은 0FFFFFFFFh라고 나온 걸까 의문이 든다 이 수는 미지수지만 내가 실험을 해봤다
0FFFFFFFFh는 양수지만 내가 집적 -2로 바꿔서 봤더니 0FFFFFFFE라고 한다...
그렇다면 0FFFFFFFh는 -1이고 여기서 -1를 더한 0FFFFFFFEh는 -2라고 하니 우리는 숫자가 거꾸로 뒤집힌 것이 음수라 생각 할 수 있겠다