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 |