궁금한게 많은 열아홉
article thumbnail

어셈블리어

기계어와 대응되는 로우 레벨 언어이다. 컴파일이 빠르고 유지보수가 힘들어 거의 사용되지 않지만 하드웨어 디버깅을 할 때 유용하게 사용됨.

레지스터

소량의 데이터, 처리중인 중간결과를 일시적으로 기억해두는 고속의 저장영역이다. CPU는 자체 저장 기능이 없는데, 이를 보완하는 역할을 한다. 32비트는 E(AX) 64비트는 R(AX)와 같이 표현된다.

 

  • Intel과 AT&T문법이 존재하며, 둘은 호환되지 않는다.
    • Intel : 뒤에서 앞으로, 숫자를 그대로 사용, 명칭 그대로를 사용
    • AT&T : 앞에서 뒤로, 숫자 앞에 $를 붙여서 사용, 명칭 앞에 %를 붙임

!! 단순히 계산한 값은 동일하지만 저장되는 레지스터가 달라져 이후 계산 시 결과가 달라짐

범용 레지스터

EAX

사칙연산 등 산술에 사용되고, 함수 리턴 값을 처리하기도 함.

EBX

간접 번지 지정에 사용됨. (산수, 변수 등을 저장)

ECX

루프 문에서 count 역할을 수행함.

EDX

EAX의 보조 역할.(나누기에서 몫 : EAX), (나머지 : EDX)

인덱스 레지스터

ESI

복사 또는 비교 시 출발지 주소 저장

EDI

복사 또는 비교 시 목적지 주소 저장

 

 

 

어셈블리 명령어

  1. PUSH (push eax) : eax 값을 스택에 저장
  2. POP (pop eax) : 스택 최상단 값을 꺼내 eax에 저장
  3. MOV (mov eax, ebx) : 메모리, 레지스터 값을 변경
  4. INC (inc eax) : eax 값을 1증가 (++)
  5. DEC (dec eax) : eax 값을 1감소 (--)
  6. ADD (add eax, ebx) : 메모리, 레지스터 값을 덧셈함
  7. SUB (sub eax, ebx) : 메모리, 레지스터 값을 뺄셈함
  8. CALL (call proc) : 프로시저를 호출함.
  9. RET (ret) : 호출 실행된 주소 바로 다음으로 이동
  10. CMP (cmp eax, ebx) : 레지스터끼리 값 비교
  11. JMP (jmp proc) : 특정한 곳으로 분기
  12. INT (int $0x80) : OS 인터럽트 영역을 시스템콜
  13. NOP (nop) : 아무 동작 없음 (no operation)

등등...

 

이제 이를 바탕으로 코드엔진의 1번 문제를 풀이해보겠다.

 

RCE1번 풀이 _ 윈도우 환경

문제 다운로드

빨간 네모 상자 클릭

X64dbg를 통해 오픈

x64dbg를 다운 받고 x32dbg.exe파일을 실행시켜 열어준다.

메인 함수 이동(f9)

모든 프로그램은 메인 함수를 통해서 실행되기 때문에 f9를 클릭하여 메인 함수로 이동한다.

f8을 눌러서 한 줄씩 실행시켜보고 멈추는 곳을 확인한다.

아마 MessageBoxA에서 멈출것이다.

그리고 작업 표시줄을 확인해보면 메세지 박스가 뜨는 걸 볼 수 있다. 그 밑에 2줄 내려가보면 GetDriveTypeA가 있는것을 알수 있다.

문제에서 GetDriveTypeA의 리턴값을 찾는 것이 목적이라고 했다. 

f2를 클릭해서 분기점을 찍어준다.

오른 쪽에 보면 esi와 eax가 맞지 않는걸 알 수 있고, esi를 1로 바꿔주면 된다.

 

그리고 그 밑에 cmp(if문의 시작점)에서 문제가 발생했다는 것을 알 수 있다. je 01.20103D를 보면 빨간색으로 하이라이트 되어있다.

이 부분을 jne로 바꿔주고 f8을 눌러 실행해보면 아래와 같이 실행된다.

그리고 프로그램이 종료하면 빈화면만 남게 된다.

profile

궁금한게 많은 열아홉

@jjin502

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!