1580, 1/79 회원가입  로그인  
   salangi11
   리버스 엔지니어링 (어셈블리) -1

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=8386 [복사]


리버스 엔지니어링을 위한 어셈블리







1. C와 어셈블리를 비교할 때, 어셈블리는 한번에 하나의 동작.




2. 지금 배우는 것은 IA-32(가장 대중화된 것.)




3. 기본형태 : "명령어 + 인자"




4. 옵코드(opcode)=명령어




5. 인자 : 어떤 장소? + 명령어에 영향 받는 것 = 오퍼랜드(operand)




6. push를 쓰면 스택에 값이 넣어짐.


스택이란?

스택(stack)은 모든 원소들의 삽입(insert)과 삭제(delete)가 리스트의 한쪽 끝에서만 수행되는 제한 조건을 가지는 선형 자료 구조(linear data structure)로서, 삽입과 삭제가 일어나는 리스트의 끝을 top이라 하고, 다른 한쪽 끝을 bottom이라 한다. 스택은 종종 pushdown stack이라고도 하는데, 스택의 top에 새로운 원소를 삽입하는 것을 push라 하고, 가장 최근에 삽입된 원소를 의미하는 스택의 top으로부터 한 원소를 제거하는 것을 pop이라 한다. 이와 같은 스택 연상은 항상 스택의 top에서 발생하므로 top 포인터의 값을 1씩 증가 또는 감소시킴으로써 수행된다.


[네이버 지식백과] 스택 [stack] (컴퓨터인터넷IT용어대사전, 2011. 1. 20., 일진사)




7. mov도 push랑 비슷한데, 조금 다름

ex) push 12

=>는 스택에 12라는 값을 넣는 것

mov oo, 1000

=>oo에다가 1000 넣는 것.



memcpy는 메모리 복사 함수고, strcpy는 문자열 전체 복제 함수라 C언어에서 볼 때, 이것과 같다고 해줄 수 있을 것 같다.




8. 어셈블리는 단순


->단순함에서 어려움이 나옴.




C언어로는 쉽게 표현할 수 있는 것이 매우 길게 표현될 수 밖에 없으니까.




9. 레지스터

IA-32의 범용 레지스터는 총 8개, 레지스터를 '변수'라고 생각하자. CPU가 사용하는 변수라고.

연산 레지스터로 EAX, EDX, ECX, EBX가 있으며 주소 레지스터로 ESI EDI등이 존재한다.




9-1. 연산 레지스터




EAX : 산술 계산을 하며, 리턴값(컴퓨터 프로그래밍에서 return 문은 현재의 함수에서 값이나 주소를 반환할 때 사용한다.)을 전달한다.

가장 많이 쓰는 레지스터. 연산에서 사용된다.

EAX의 A가 Accumulator의 약자이다.




EDX : EAX와 같이 연산에 이용하되, 리턴 값의 용도로 사용되지 않는다.




ECX : 반복문을 사용할 때, 반복에서 탈출하기위한 역할이 필요하다. 조건을 설정하고 (i<10) 그 조건을 증가시키는 카운팅(i++)을 통해

반복문을 중단하고 탈출하게 된다. 어셈블리에서 사용되는 카운팅이라 부를 수 있는 ECX는 처음 초기 값에서 1씩 감소하고, 카운터(i)가 0이 될 때, 반복문을 중단한다.

C가 count의 약자이다.




EBX : 의미 없다. 부족해서 공간이 더 필요할 때, 사용한다.







9-2. 주소 레지스터




ESI : 시작지 인덱스




EDI : 목적지 인덱스




ESI의 값을 EDI로 복사한다고 생각하면 쉬움. (S와 D가 Source와 Destination의 약자.)







9-3. 세부(하위) 레지스터




AX : 16비트(2바이트)

AH : 8비트(1바이트)

AL : 8비트(1바이트)




Ex) EAX가 0xabcdefgh라면

EAX의 AX는 efgh, AH는 de, AL은 gh다.



​추신 : 빨리 유치원생에서 탈출하면 좋겠다.
        뭔가 오류있으면 말해주십시오!!!


참고 : 리버스 엔지니어링 바이블. 위키백과

  Hit : 7510     Date : 2017/02/21 11:59



    
     [공지] 강좌를 올리실 때는 말머리를 달아주세요^ㅡ^ [29] 멍멍 02/27 18453
1579   리눅스 커널 2.6 버전 이후의 LKM     jdo
07/25 380
1578   쉘코드 모음     해킹잘하고싶다
01/15 1160
1577   Call by value VS Call by Reference     해킹잘하고싶다
01/15 622
1576   (꼼수) L.O.B 한방에 클리어하기[1]     해킹잘하고싶다
01/14 872
1575   towelroot.c (zip) 코멘팅.[1]     scube
08/18 3376
1574   levitator.c (안드로이드 루팅) 공격 분석 소스 코드 공유.[4]     scube
08/17 3368
1573   무료 정보보안 기술인재 양성 과정 교육생 모집     chanjung111
06/17 4127
1572   K-Shield 주니어 5기 모집     lrtk
06/17 3895
1571   [팁] 파이썬 2소스를 3으로 변경해주는 사이트[3]     한승재
05/13 3583
1570   구글 백링크 작업 질문요     wkatnxka
03/30 3076
1569   [팁] 우분투 미러링서버     한승재
03/09 3724
1568 비밀글입니다  감을못잡겠네요ㅜㅜ     잉잉잉
01/15 3
1567   데비안 계열 리눅스 의존성 깨졌을때 해결법     한승재
11/27 4207
1566   홍보합니다. 신생 보안커뮤니티입니다.     kimwoojin0952
10/26 3953
1565   신기한 프로그래밍 언어[3]     koreal33t
09/06 4354
1564   윈도우,리눅스에서 내 ip를 확인해 보자 [1]     koreal33t
09/06 3564
1563   CTF 사이트[1]     koreal33t
09/06 4195
1562   자격증 (문제)사이트 [2]     koreal33t
09/06 4011
1561   [퍼온글]리눅스 기본 명령어     한승재
06/06 4775
1 [2][3][4][5][6][7][8][9][10]..[79]

Copyright 1999-2023 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org & Wowhacker.com