
IDA 2016 플러그인 콘테스트 우승작! 기호 실행이 단 한 번의 클릭으로 가능합니다!
Ponce (발음: [ 'poN θe ] 폰-세)는 IDA Pro 플러그인으로, 사용자가 바이너리에 대해 쉽고 직관적인 방식으로 오염 분석(taint analysis)과 기호 실행(symbolic execution)을 수행할 수 있게 해줍니다. Ponce를 사용하면 최첨단 기호 실행의 모든 기능을 단 한 번의 클릭으로 사용할 수 있습니다. 전체가 C/C++로 작성되었습니다.
기호 실행은 보안 커뮤니티에서 새로운 개념이 아닙니다. 수년 동안 존재해 왔지만, 2015년경이 되어서야 Triton 및 Angr와 같은 오픈 소스 프로젝트가 이러한 필요를 해결하기 위해 만들어졌습니다. 이러한 프로젝트의 가용성에도 불구하고, 최종 사용자는 종종 특정 사용 사례를 직접 구현해야 하는 상황에 놓입니다.
우리는 리버스 엔지니어링에 가장 많이 사용되는 디스어셈블러/디버거 내에서 기호 실행 및 오염 분석을 구현하는 IDA 플러그인인 Ponce를 만들어 이러한 필요를 해결했습니다.
Ponce는 IDA 버전 >= 7.0에서 x86 및 x64 바이너리 모두에서 작동합니다. 플러그인 설치는 최신 빌드에서 해당 파일을 IDA 설치 디렉토리의 plugins\ 폴더에 복사하기만 하면 됩니다.
호환성 문제를 피하기 위해 IDA 버전에 맞게 컴파일된 Ponce 바이너리를 사용해야 합니다.
Ponce는 Windows, Linux, OSX에서 기본적으로 작동합니다!
플러그인은 처음 실행될 때 자동으로 실행되며 초기 구성을 안내합니다. 구성은 구성 파일에 저장되므로 구성 창에 대해 다시 걱정할 필요가 없습니다.
다음 gif에서는 자동 오염 사용과 조건을 부정하고 디버깅 중에 메모리에 주입하는 방법을 볼 수 있습니다:
argv를 기호화하는 옵션을 설정합니다.elite 키를 얻고 Win 코드에 도달합니다.crackMe 소스 코드는 여기에서 확인할 수 있습니다.

이 예제에서는 cmake와 함께 오염 엔진을 사용하는 것을 볼 수 있습니다. 우리는:
fread()가 파일에서 읽는 버퍼를 오염시킵니다.
다음 예제에서는 스냅샷 엔진을 사용하고 있습니다:
fread()가 파일에서 읽는 버퍼를 오염시킵니다.
예제 소스 코드는 여기에서 확인할 수 있습니다.
이 섹션에서는 다양한 Ponce 옵션과 키보드 단축키를 설명합니다:













Ponce는 Triton 프레임워크에 의존하여 시맨틱, 오염 분석 및 기호 실행을 제공합니다. Triton은 Quarkslab이 후원하고 주로 Jonathan Salwan이 유지 관리하는 풍부한 라이브러리를 갖춘 훌륭한 오픈 소스 프로젝트입니다. Triton에 대한 Jonathan의 작업에 감사하고 지지합니다. 최고입니다! :)
Ponce v0.3부터는 빌드 컴파일 프로세스를 CMake로 전환했습니다. 이를 통해 Linux, Windows, OSX에서 구성과 빌드 방식을 통합했습니다. 이제 기호 또는 오염 명령어에 대한 피드백을 의사 코드로 제공하는 기능을 지원합니다. 이 기능을 사용하려면 IDA SDK include 폴더에 hexrays.hpp를 추가해야 합니다. hexrays.hpp는 IDA 설치 경로의 plugins/hexrays_sdk/에서 찾을 수 있습니다. hex-rays 디컴파일러를 구매하지 않은 경우 -DBUILD_HEXRAYS_SUPPORT=OFF를 사용하여 Ponce를 빌드할 수 있습니다. CI 환경으로 Github Actions를 사용합니다. 빌드 프로세스를 이해하려면 액션 파일을 확인하세요.
Juan Ponce de León (1474 – 1521년 7월)은 스페인 탐험가이자 정복자였습니다. 그는 미국의 플로리다를 발견했습니다. IDA 플러그인은 바이너리의 다양한 경로를 발견하고 탐색하며 정복하는 데 도움을 줄 것입니다.
네, Windows IDA에서 Ponce를 기본적으로 사용하거나 Linux 또는 OS X 상자에 원격으로 연결하여 사용할 수 있습니다. 다음 Ponce 버전에서는 Linux 및 OS X IDA 버전을 기본적으로 지원할 예정입니다.
테스트에서 초당 3000개의 명령어를 처리했습니다. 속도를 높이기 위해 IDA에서 제공하는 PIN 트레이서를 사용할 계획입니다.
이슈를 열어주세요. 최대한 빨리 해결하겠습니다 ;)
물론입니다! 풀 리퀘스트를 보내고 열려 있는 이슈에 대해 작업해 주세요. 도움에 대해 맥주로 보답하겠습니다 ;)
Concolic 실행과 Ponce에는 몇 가지 문제가 있습니다:
기호 메모리 로드/쓰기: x = aray[symbolic_index]와 같이 메모리 값을 읽는 데 사용된 인덱스가 기호인 경우, 오염/기호화된 사용자 제어 입력을 추적하지 못하는 문제가 발생할 수 있습니다.
Triton은 부동 소수점 명령어에서 잘 작동하지 않습니다.
Concolic 실행은 실행된 명령어만 분석합니다. 즉, 다음과 같은 경우 기호 추적이 손실됩니다:
int check(char myinput) // Input is symbolic/tainted
{
int flag = 0;
if (myinput == 'A') //This condition is symbolic/tainted
flag = 1
else
flag =- 1;
return flag; // flag is not symbolic/tainted!
}