분류 전체보기
-
[2022/03/22][짤막한 이야기 - 재동기화]짤막한 이야기 2022. 3. 22. 13:51
[2022/03/22][짤막한 이야기 - 재동기화] 이번에 포스트할 내용은 어셈블리어나 디버깅에 익숙하지 않으면 생소할 수 있는 “재동기화(Resynchronization)”에 관한 내용이다. 재동기화는 x86 어셈블리어에서 쉽게 관찰되는 특징으로, 이 특징이 있기 때문에 바이트 변형에 어느 정도는 내성을 가진다고 볼 수 있다. 그림의 위 화면은 AbexCrackMe#1이라는 프로그램을 디버거로 분석하는 화면이다. 그림의 아래 화면은 이 AbexCrackMe#1의 첫번째 바이트를 0x6A에서 0x6B로 1을 더하였을 때 발생하는 현상이다. 위 화면에서는 첫 번째 줄에 “0x6A 0x00”의 2개 바이트를 합쳐서 “push 0”라는 명령어로 디스어셈블 되었다. 그런데 아래 화면에서는 첫 번째 줄에 “0x6..
-
[2022/03/18][짤막한 이야기 - 예외 기반 분석방지 기술(SingleStep)]짤막한 이야기 2022. 3. 21. 16:04
[2022/03/18][짤막한 이야기 - 예외 기반 분석방지 기술(SingleStep)] “SingleStep(싱글스텝)”은 예외를 발생시키는 방법 중 하나이다. 싱글스텝은 트랩플래그(TrapFlag, TF)에 의하여 실행될 수 있는 하나의 “모드”이다. 흔히 알려진 플래그로는 제로플래그(ZeroFlag, ZF)가 있는데, 이런 플래그는 1비트(0[False] 혹은 1[True])로 토글(Toggle)되는 성질을 가지고 있다. 트랩플래그와 제로플래그 등의 플래그는 모두 EFLAGS라는 레지스터에 포함되는 플래그 값이다. 트랩플래그의 값이 1[True]로 셋팅되어 있으면 CPU가 싱글스텝 모드에 진입하게 된다. 이 싱글스텝 모드는 간단히 말하면 예외가 발생하게되는 상태이고, 엄밀히 말하면 어셈블리어 하나를..
-
[2022/03/18][짤막한 이야기 - 예외 기반 분석방지 기술(예시)]짤막한 이야기 2022. 3. 18. 11:16
[2022/03/18][짤막한 이야기 - 예외 기반 분석방지 기술(예시)] 분석방지 기술(Anti-Analysis)은 SW 보호 기술 중 한 갈래로, 분석용 도구의 분석을 방해하거나 금지시키는 기술이다. 예외 기반의 분석방지 기술은 구현하기도 가장 까다로운데, 어떤 예외를 적절하게 일으킬지를 알고 있어야 구현 가능하기 때문이다. 그림의 함수 소스코드는 C언어로 구현되어 있으며, SingleStep이라는 예외를 강제로 발생시키는 함수(SingleStep의 의미는 다음 포스트에서 확인할 수 있다.)이다. 예외가 발생하였기 때문에 예외 처리문(Exception Handling)을 실행하게 되는데, 그 코드가 바로 “return FALSE;”이다. 여기서 FALSE는 분석 도구가 탐지되지 않았다는 의미이다. 그..
-
[2022/03/17][짤막한 이야기 - 예외 기반 분석방지 기술(개념)]짤막한 이야기 2022. 3. 17. 17:22
[2022/03/17][짤막한 이야기 - 예외 기반 분석방지 기술(개념)] 분석방지 기술(Anti-Analysis)은 SW 보호 기술 중 한 갈래로, 분석용 도구의 분석을 방해하거나 금지시키는 기술이다. 일반적으로 분석 도구의 탐지(Detection)와 분석 도구가 탐지되었을 경우의 대응(Response)을 합하여 분석을 방지한다고 일컫는다. 대응의 경우는 대부분 대동소이하다. 그 분석 도구를 강제로 종료시키거나 보호 대상이 되는 SW(자기 자신)를 강제로 종료시키는 것이다. 그런데 탐지 방법은 대응 방법에 비하여 훨씬 더 다양하다. 이번 포스트에서는 예외(Exception)를 기반으로 하여 분석 도구를 탐지하는 방법을 개념적으로 설명하고자 한다. “예외”는 이미 프로그래머들이 잘 알고있는 개념이다. 예..
-
[2022/03/16][짤막한 이야기 - 다이나믹 베이스]짤막한 이야기 2022. 3. 16. 08:18
[2022/03/16][짤막한 이야기 - 다이나믹 베이스] 다이나믹 베이스(Dynamic Base) 또한 Windows의 EXE 파일(= 소프트웨어)이라면 반드시 가지고 있는 속성이다. 이는 앞선 포스트에서의 이미지베이스(ImageBase)에 적용되는 개념으로 볼 수 있으며, 이 이미지베이스를 “프로그램 실행 시마다 매번 다르게 부여”하는 특징이 있다. 즉, 이미지베이스 값이 0x400000으로 되어있어도 실행할 때 반드시 0x400000이라는 보장이 없는 것이다. 아래 디버거에서의 스크린샷을 보면 주소가 0xD22886으로 되어있으며, 이는 이미지베이스가 0x400000이지만 다이나믹 베이스가 적용되어 있어서 실제 적재된 이미지의 시작위치가 0x400000이 아닌 0xD10000으로 변경된 경우이다. ..
-
[2022/03/15][짤막한 이야기 - 이미지베이스]짤막한 이야기 2022. 3. 15. 13:30
[2022/03/15][짤막한 이야기 - 이미지베이스] 이미지베이스(ImageBase)는 Windows의 EXE 파일(= 소프트웨어)이라면 반드시 가지고 있는 속성이다. 이미지 상태에서의 베이스 값을 의미하는데, 즉, 프로그램이 메모리에 적재될 때의 시작위치를 의미한다. 그림의 PEView는 HelloWorld.exe를 UPX 패커로 패킹을 적용하였을 때의 이미지베이스를 보여준다. 0x400000의 위치에 HelloWorld.exe가 적재될 예정이라는 의미이다. 일반적으로 컴파일러가 소스코드를 프로그램으로 컴파일할 때, 이미지베이스는 0x400000으로 자동 설정된다. 그런데 그림의 아래에서 4가지의 이미지를 볼 수 있는데, 각각의 시작주소가 모두 다름을 확인할 수 있다. 4개의 프로그램은 모두 이미지베..
-
[2022/03/14][짤막한 이야기 - UPX의 트릭]짤막한 이야기 2022. 3. 14. 10:41
[2022/03/14][짤막한 이야기 - UPX의 트릭] UPX(Ultimate Packer for eXecutables)는 가장 대표적으로, 범용적으로 활용되는 실행파일(소프트웨어) 압축 프로그램(= 패커)이다. UPX는 실행파일의 용량을 극단적으로 줄이기 위하여 파일 구조를 이용한 트릭을 사용한다. 일반적인 패킹과 언패킹을 생각해보면 패킹된 코드와 원본 코드의 사이즈가 같으며, 언패킹을 수행하기 위한 언패킹 루틴이 소프트웨어 내에 추가로 필요하다. 따라서 일반적인 패킹 기술을 프로그램에 적용하는 경우에는 프로그램 용량이 더 증가할 수도 있다. 그러나 코드 패킹 기술을 정말 압축률이 좋은 알고리즘을 이용한다면 원본 코드보다 훨씬 더 적은 양의 패킹된 코드가 생성될 것이고, 이는 용량을 감소시키는 역할을..
-
[2022/03/11][짤막한 이야기 - UPX]짤막한 이야기 2022. 3. 11. 11:33
[2022/03/11][짤막한 이야기 - UPX] UPX(Ultimate Packer for eXecutables)는 가장 대표적으로, 범용적으로 활용되는 실행파일(소프트웨어) 압축 프로그램(= 패커)이다. 일반적인 개발자들은 압축 프로그램하면 보통 AlZip, 7zip, BandiZip 등 다수의 프로그램을 하나로 묶어주며 용량을 줄여주는 그러한 소프트웨어를 생각하기 쉽다. 그러나 보안과 관련된 개발자들은 압축 프로그램을 그러한 관점에서만 바라보지 않는다. 이 압축 프로그램은 실행코드를 보이지 않게 감추어주는 역할을 한다. 즉, 다수의 프로그램이 아닌 단일의 실행파일(예: .EXE파일)에 대하여 내부를 압축해주는 프로그램인 것이다. 압축 해제는 프로그램이 실행될 때, 압축된 코드가 실행되기 직전에 알아..