안녕하세요! 지난번에는 지뢰찾기 게임을 리버싱 했었는데요, 오늘은 어렸을 때 많이 했던 피카츄배구를 분석하였습니다. 디버거 툴은 치트엔진을 사용하였고, 악용방지를 위해 구체적인 방법은 포스팅하지 않겠습니다^^ 각각의 플레이어의 스코어를 제어하는 부분은 쉽게 할 수 있었습니다. 스코어는 4byte일 확률이 매우 높기 때문에 쉽게 접근할 수 있었고 초기 값과 변하는 값을 계속 확인할 수 있어서 금방 메모리 주소를 찾을 수 있었습니다. 총 점수 역시 5점, 10점, 15점으로 제한이 걸려있었고, 초기 값을 임의로 두고 값을 계속 변화시키면서 메모리 주소 값을 쉽게 찾을 수 있었습니다. 조금 시간이 걸린 부분은 게임 속도를 제어하는 부분이었습니다. 속도는 초기 값이 주어지지 않았고 저는 빨라지면 찾고자 하는 어..
안녕하세요! 오늘은 지금까지 배웠던 어셈블리어 명령어들을 응용하여 난독화 프로그램을 만들어보겠습니다. ●난독화 (Obfuscation) ●難(어려울 난) + 讀 (읽을 독) = 코드를 읽기 어렵게 만드는 것. ●왜?? 코드를 보호하거나 알아보기 힘들게 하기 위해 난독화를 진행한다. ●누가?? 악성코드 제작자, 소프트웨어 개발자 등등 xor 명령어를 응용하여 "hello world!"를 난독화해서 출력하는 프로그램을 만들어보겠습니다. 다음과 같은 어셈블리 프로그램을 구현해봤습니다. 지금까지 작성해왔던 프로그램과는 다른점은 main section뿐만 아니라 임의로 loop이라는 section을 추가했다는 점입니다. 코드를 분석을 해보면, hello world! 문자열을 가진 message를 스택에 push ..
안녕하세요! 오늘은 어셈블리어 inc, cmp, test, dec, jcc, call, jmp 명령어에 대해서 알아보겠습니다. ● x86 명령어 레퍼런스에 대한 자세한 내용은 이곳을(http://kernfunny.org/x86) 참고하세요. INC : 피연산자의 값을 1 증가시킴. # OF, SF, ZF, AF, PF에 영향 DEC : 피연산자의 값을 1 감소시킴. # OF, SF, ZF, AF, PF에 영향 INC나 DEC는 보통 반복문에서 많이 쓰입니다. CMP : 두 값을 비교 # cmp 레지스터, 상수값 # cmp r/m32, 상수값 # cmp r/m32, 레지스터 # cmp 레지스터, r/m32 # 참고 레퍼런스에 따르면 Source1에서 Source2를 뺀 결과에 의해 Flags가 영향을 받는..
안녕하세요! 지난 시간에 이어서 오늘은 어셈블리어 명령어 중 lea, and, or, xor 명령어에 대해서 알아보겠습니다. LEA (Load Effective Address) : 유효 주소 로드 # 출발지는 r/m32 # 목적지는 레지스터 # 레지스터 연산 결과를 레지스터에 저장(not 포인터) MOV와 무엇이 다른가?? # MOV는 값을 로드한다. mov eax, [ebx+ecx] # LEA는 유효 주소를 로드한다. lea eax, [ebx+ecx] lea 명령어를 사용해서 프로그램을 짜보겠습니다. gdb를 사용하여 분석을 하기전에 이 프로그램이 어떻게 동작할지 미리 고민을 해보시기 바랍니다. mov연산을 실행하고 나서 eax에는 1, ebx에는 4, ecx에는 7이 저장될 것입니다. 위에서 설명했듯..
안녕하세요! 지난 시간에는 mov 명령어를 알아보았는데요, 이번 시간에는 add, sub 명령어를 알아보겠습니다. ※ r/m 32 주소형식 : 피연산자 크기 속성이 32비트인 명령어에 사용하는 더블워드 범용 레지스터 또는 메모리 피연산자. ※ r/m32는 다음과 같은 형식을 가지는 문법을 의미합니다. # mov eax, ebx (ebx에 담긴 내용을 eax로 복사) # mov eax, [ebx] (ebx에 담긴 내용이 가리키는 주소의 내용을 eax로 복사) # mov eax, [ebx+ecx*X] (ebx에서 ecx*X 만큼 떨어진 곳에 위치한 주소의 내용을 eax로 복사) # mov eax, [ebx+ecx*X+Y] (ebx에서 ecx*X+Y 만큼 떨어진 곳에 위치한 주소의 내용을 eax로 복사) AD..
안녕하세요! 이번 시간에는 mov 명령어에 대해서 알아보고 직접 mov 명령어를 사용해서 어셈블리 프로그래밍을 해볼거에요. 지난 시간에는 gdb를 사용하여 막 짜본 프로그램을 분석을 해보았는데요, 우리가 짠 프로그램의 문제점이 무엇이었는지 기억하시나요?? 네, 프로그램의 문제점은 프로그램의 종료를 알리는 신호를 주지 못해서 Segmentation fault가 발생한다는 점이었습니다. 프로그램의 끝은 시스템 콜을 이용해야 하는데요, 이번 시간에는 시스템 콜을 이용하여 프로그램을 정상적으로 종료시키는 방법도 알아보겠습니다. 자 그럼 MOV 명령어는 무엇이냐!!? MOV : 데이터 복사를 담당하는 명령어 # 레지스터 -> 레지스터 (레지스터에서 레지스터로 데이터를 복사) # 메모리 레지스터 (메모리에서 레지스..
- Total
- Today
- Yesterday
- reversing
- 스택
- 사이버공격
- 해킹
- linux
- Push
- 명령어
- jmp
- cmp
- nasm
- 터미널
- add
- gdb
- mov
- 어셈블러
- 치트엔진
- ubuntu
- 우분투
- system call
- vim
- call
- 어셈블리어
- Sub
- 리눅스
- 논리연산
- 리눅스 시스템 콜
- 리버스 엔지니어링
- 어셈블리
- 리버싱
- instruction
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 27 | 28 | 29 | 30 |