Quiz: x86 Assembly 1

이쑤신개자두·2023년 6월 17일
0

어셈블리어

목록 보기
5/6

CODE

[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

Question.

end로 점프하면 프로그램이 종료된다고 가정하자.
프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면?


Solution.

1. mov dl, BYTE PTR[rsi+rcx]

  • rsi + rcx =0 + 0x400000
  • 0x400000이고 메모리 0x400000번지에 있는 값을 1바이트(8비트)만큼 참조하면 0x67. 이값을 dl에 대입

2. xor dl, 0x30

  • 0x67과 0x30을 xor 연산하면 01010111. 이는 0x57

3. mov BYTE PTR[rsi+rcx], dl

  • xor 연산해서 나온값 0x57을 [rsi+rcx]위치에 이동시키고 이동시킨 값을 1바이트만 참조
  • 0x400000 메모리 번지의 값은 0x57

4. inc rcx

  • rcx의 값을 1증가시키면 rcx=1

5. cmp rcx, 0x19

6. jg end

7. jmp 1

1과 0x19값을 비교하여 (코드5번)

전자가 더크면 end로 점프(코드6번),

문제에서 end로 점프시 프로그램이 종료된다고 했으므로 전자가 더크면 프로그램 종료

그러나 전자가 더 크지 않을경우 코드 마저 진행. 7번 코드로 인해 다시 코드 1번으로 분기

조건을 충족시키지 못할경우 7번 코드로 인해 다시 1번부터 실행되므로 조건을 만족시킬때까지 반복되는 코드이다.

그리고 4번 코드로 인해 rcx값은 계속 올라가며 0x19는 10진수 25이므로 rcx값이 25가 될때까지 해당 코드 반복실행

0x400000 = 0x57
0x400001 = 0x55를 0x30과 xor연산한 값...
0x400002 = 0x5c와 0x30을 xor연산한 값...
.
.
.
profile
25.04.28 Restart ~ 1일 1포스트 & 1일 1커밋!

0개의 댓글