Reversing/ASM to C
ASM to C with IDA - 011
MarcoKhan
2018. 5. 27. 20:23
C300_011
C300_소스코드
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> main() { char str[] = "대한민국"; char *j = "I love Korea"; printf("문자열형 변수 str의 값은 %s \n", str); printf("문자열형 상수 j의 값은 %s \n", j); } | cs |
IDA - Layout Graph
IDA - Text View
우선 dword 값을 보자.
아래와 같이 dword_403020, dword_403024에 어떤 값이 들어가긴 들어가는데 16진수로 되어 있어서 어떤 값이 들어가는지 한 눈에 알 수 없다.
dd 0D1C7EBB4h를 마우스 오른쪽 클릭하거나, 'R'을 누르면 값이 유니코드로 보인다.
유니코드는 한 글자에 2바이트 이다. 따라서 두 글자에 4바이트가 필요하다. 또한 little endian 방식을 사용하고 있어 값의 순서가 바뀌어 들어간다.
byte_403028은 0을 넣어주는데, 이것이 문자열 끝에 항상 존재하는 nul 문자이다.
참고로 security cookie는 bof를 막기 위해 buffer 사이에 생성되는 것인데 SEH를 공부하면 더 자세히 알 수 있다.
pseudo code - 의사 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <stdio.h> main() { int j; char str[12]; eax = dword_403020; *str = eax; ecx = dword_403024; *str = ecx; dl = byte_403028; *str+8 = dl; j = offset aIloveKorea; eax = str; printf(_Format, eax); ecx=j; printf(byte_40305C, ecx); eax = 0; } | cs |
j 메모리 공간에 "IloveKorea"를 가르키는 메모리 주소가 저장되어 있다.
따라서 j의 메모리 접근을 통해 "IloveKorea"를 출력할 수 있다.
pseudo code - 최종 의사 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> main() { int *j; char str[12]; *str = "대한"; *(str+4) = "민국"; *(str+8) = NULL; j = "IloveKorea"; printf(_Format, str); printf(byte_40305C, j); } | cs |