어셈블리어
기계어와 대응되는 로우 레벨 언어이다. 컴파일이 빠르고 유지보수가 힘들어 거의 사용되지 않지만 하드웨어 디버깅을 할 때 유용하게 사용됨.
레지스터
소량의 데이터, 처리중인 중간결과를 일시적으로 기억해두는 고속의 저장영역이다. CPU는 자체 저장 기능이 없는데, 이를 보완하는 역할을 한다. 32비트는 E(AX) 64비트는 R(AX)와 같이 표현된다.
- Intel과 AT&T문법이 존재하며, 둘은 호환되지 않는다.
- Intel : 뒤에서 앞으로, 숫자를 그대로 사용, 명칭 그대로를 사용
- AT&T : 앞에서 뒤로, 숫자 앞에 $를 붙여서 사용, 명칭 앞에 %를 붙임
!! 단순히 계산한 값은 동일하지만 저장되는 레지스터가 달라져 이후 계산 시 결과가 달라짐
범용 레지스터
EAX
사칙연산 등 산술에 사용되고, 함수 리턴 값을 처리하기도 함.
EBX
간접 번지 지정에 사용됨. (산수, 변수 등을 저장)
ECX
루프 문에서 count 역할을 수행함.
EDX
EAX의 보조 역할.(나누기에서 몫 : EAX), (나머지 : EDX)
인덱스 레지스터
ESI
복사 또는 비교 시 출발지 주소 저장
EDI
복사 또는 비교 시 목적지 주소 저장
어셈블리 명령어
- PUSH (push eax) : eax 값을 스택에 저장
- POP (pop eax) : 스택 최상단 값을 꺼내 eax에 저장
- MOV (mov eax, ebx) : 메모리, 레지스터 값을 변경
- INC (inc eax) : eax 값을 1증가 (++)
- DEC (dec eax) : eax 값을 1감소 (--)
- ADD (add eax, ebx) : 메모리, 레지스터 값을 덧셈함
- SUB (sub eax, ebx) : 메모리, 레지스터 값을 뺄셈함
- CALL (call proc) : 프로시저를 호출함.
- RET (ret) : 호출 실행된 주소 바로 다음으로 이동
- CMP (cmp eax, ebx) : 레지스터끼리 값 비교
- JMP (jmp proc) : 특정한 곳으로 분기
- INT (int $0x80) : OS 인터럽트 영역을 시스템콜
- 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을 눌러 실행해보면 아래와 같이 실행된다.
그리고 프로그램이 종료하면 빈화면만 남게 된다.
'정보보안' 카테고리의 다른 글
[정보보안] ChatGPT를 조심하세요! (0) | 2023.08.17 |
---|---|
[정보보안] 내가 접속한 사이트를 의심해봐야 하는 이유 (0) | 2023.08.17 |
[정보보안] bof (0) | 2023.06.15 |
[정보보안]시스템해킹 (0) | 2023.06.15 |
[정보보안] sql Injection (0) | 2023.06.15 |