end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 어느 문자열이 나오는가?
[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
1: dl=0x67 (BYTE PTR[...] 는 ...이 가리키는 위치에서 1byte만큼 참조하라는 뜻)
2: dl=0x67 xor 0x30 = 0x57
3: BYTE PTR[0x400000]에 dl 대입 -> 0x67이란 위치에 대입하라는 것 아님. 포인터에 넣으라는 거
따라서 0x400000위치에 1byte만큼 dl 대입 (WORD PTR[0x4000000]는 2byte만큼 dl 대입하라는거!)
0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10 //기존
0x400000 | 0x57 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10 //mov BYTE PTR [rsi+rcx], 0x57 한 결과
위 코드 보면 메모리 맨 앞부분이 0x67에서 0x57로 바뀜! 헷갈려서 결국 mov, BYTE PTR [] 정리
4. inc rcx //rcx=0x1
5 & 6. cmp rcx, 0x19, jg end -> rcx이랑 0x19계속 비교하면서 rcx가 0x19보다 커질때 end함 (참고로 cmp는 rcx에 대입하지 않음! 주의!!)
7. 암튼 rcx <0x19 이므로 1로 jump
계속 반복하는 거같음 이과정을..........
걍 계속 하면 Welcome to assembly world!가 나온다고 한다... 디버거로 한 후 다시 수정해서 추가해야겠다 (디버거 사용법 까먹음ㅋ..)
http://www.c-jump.com/CIS77/ASM/Instructions/I77_0250_ptr_pointer.htm
Directives BYTE PTR, WORD PTR, DWORD PTR
To get around this instance, we must use a pointer directive, such as mov BYTE PTR [ESI], 5 ; Store 8-bit value mov WORD PTR [ESI], 5 ; Store 16-bit value mov DWORD PTR [ESI], 5 ; Store 32-bit value
www.c-jump.com
'Linux Exploitation > Wargame' 카테고리의 다른 글
[Pwnable.kr] fd (0) | 2023.06.03 |
---|---|
[Pwnable.kr] bof (0) | 2023.06.03 |
[ROP 시리즈 (4)] 드림핵(Dreamhack) - rop (0) | 2023.04.21 |
[드림핵(Dreamhack)] ssp_001 (0) | 2023.04.14 |
[드림핵(Dreamhack)] basic_exploitation_000 (0) | 2023.04.10 |