본문 바로가기

리버싱

(6)
pyc 분석 import marshal import dis f = open('./prob.pyc','rb') f.seek(16) v = marshal.load(f) dis.dis(v) f.close() uncompyle6이 지원하지 못하는 파이썬 버전을 분석하기 위한 코드입니다. pyc 파일의 첫 16바이트는 헤더이기에 seek을 이용하여 지워줍니다.
python에서 c rand 사용하기 # windows from ctypes import * libc=CDLL("msvcrt") libc.srand(seed) libc.rand() # linux from ctypes import * libc=CDLL("/lib/x86_64-linux-gnu/libc.so.6") libc.srand(seed) libc.rand()
arm bl 함수 호출 함수를 호출하는 부분의 주소 + bl뒤의 값 에 위치하는 함수로 이동하게 된다. 다음과 같이 0x51a6c8위치에서 bl명령어를 사용하고, bl뒤의 값이 0x63ab08일때 0x51a6c8 + 0x63ab08 = 0xb551d0 위치의 함수를 호출하게 된다. Wrapped_Int$$Add 함수의 주소값이 0xb551d0라는 것을 확인 할 수 있다.
ptrace(PTRACE_TRACEME, ...) 리버싱을 할때 다음과 같은 명령어를 확인 할 수 있었다. 구글링을 해보니 ptrace(PTRACE_TRACEME, ...)라는 함수는 자기 자신을 추적가능 상태로 만든다고 한다. 디버깅을 시작하면 해당 프로세스에 attach 하게 되고, 만약 디버깅 되고 있는 프로그램이 ptrace(PTRACE_TRACEME, ...) 함수를 사용하여 자기 자신에게 attach를 시도하게 되면 한 프로세스에 여러 프로세스가 접속할 수 없으므로 오류가 생기기 때문에 안티 디버깅 기법으로 사용할 수 있다고 한다. 참고 : https://markengine.tistory.com/308
cpp operator cpp에서는 class의 operator를 설정하여 여러가지 연산을 할 수 있음 operator[](a,b)형태로 사용하며 a[b]와 같다. ex) std::vector::operator[](a,b) 원하는데로 바꿀 수 있으므로 주로 사용되는 class 형태가 아닌경우에는 확인해보는 것이 좋음
BYTE 함수 LOBYTE : 가장 오른쪽 값 BYTE1 : 2번째 BYTE2 : 3번째 BYTE3 : 4번째 HIBYTE : 가장 왼쪽 값 v1 = 0x44332211일때 LOBYTE(v1) = 0x11 BYTE1(v1) = 0x22 BYTE2(v1) = 0x33 BYTE3(v1) = HIBYTE(v1) = 0x44