study/보안

x86 어셈블리 명령어(1) 리뷰 퀴즈

lucykorea414 2023. 9. 8. 12:37
728x90

출처: 드림핵 강의

 

[Register]
rcx = 0
rdx = 0
rsi = 0x400000
=======================
[Memory]
0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10
0x400008 | 0x44 0x5f 0x10 0x51 0x43 0x43 0x55 0x5d
0x400010 | 0x52 0x5c 0x49 0x10 0x47 0x5f 0x42 0x5c
0x400018 | 0x54 0x11 0x00 0x00 0x00 0x00 0x00 0x00
=======================
[code]
1: mov dl, BYTE PTR[rsi+rcx]
2: xor dl, 0x30
3: mov BYTE PTR[rsi+rcx], dl
4: inc rcx
5: cmp rcx, 0x19
6: jg end
7: jmp 1

 

 

퀴즈:

end 로 점프하면 프로그램이 종료된다고 가정하자. 

프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 뭘까?

 


풀이:

코드를 보면 rcx에 rsi를 더한 주소으 값을 계속 0x30이랑 xor 연산하고, rcx 값이 0x19 될때까지 xor을 하고 프로그램이 종료 된다. 즉, for문을 돌려 각 헥스값에 0x30을 xor 연산한 거라고 생각하면 될것 같다!

아스키 코드로 돌리기 위해서 다음과 같은 파이썬 코드를 작성했다.

hex_values = [
    0x67, 0x55, 0x5c, 0x53, 0x5f, 0x5d, 0x55, 0x10,
    0x44, 0x5f, 0x10, 0x51, 0x43, 0x43, 0x55, 0x5d,
    0x52, 0x5c, 0x49, 0x10, 0x47, 0x5f, 0x42, 0x5c,
    0x54, 0x11
]

# 각각의 헥스 값을 0x30으로 XOR 연산하고 결과를 출력
for hex_value in hex_values:
    xor_result = hex_value ^ 0x30
    print(f"XOR 결과: 0x{xor_result:02X}")

# 아스키로 변환한 결과를 출력
ascii_values = [chr(x ^ 0x30) for x in hex_values]
ascii_string = ''.join(ascii_values)
print("아스키 변환 결과:", ascii_string)

실행 결과: 

XOR 결과: [87, 101, 108, 99, 111, 109, 101, 32, 116, 111, 32, 97, 115, 115, 101, 109, 98, 108, 121, 32, 119, 111, 114, 108, 100, 33]
아스키 변환 결과: Welcome to assembly world!

 

728x90

'study > 보안' 카테고리의 다른 글

IDA 단축키 모음  (0) 2023.09.15
x86 어셈블리 언어 - 주요 명령어 정리 (2)  (0) 2023.09.08
x64 어셈블리 언어 - 주요 명령어 정리 (1)  (0) 2023.09.08
윈도우 메모리 구조  (0) 2023.09.07
정적분석 vs 동적분석  (0) 2023.09.07