[실습환경]
Ubuntu 18.04 LTS[도구]
Frida
Frida는 바이너리 내 어떤 함수가 호출되는지 보여주고, 조작이 가능하도록 한다.
동적 바이너리 조사(DBI, Dynamic Binary Instrumentation)를 가능하게 해주는 프레임워크이다.
다양한 운영체제를 지원하고 있으며 파이썬 기반의 프레임워크로 다양한 API를 지원한다.
Frida Tutorial
Frida를 사용하여 호출된 함수를 검사하고, 인수를 수정하고, 대상 프로세스 내의 함수에 대한 사용자 지정 호출을 수행하는 방법을 보여준다
https://frida.re/docs/quickstart/
위의 문서를 기반으로 작성하였다.
1. 파일 생성(hello.c)
#include <stdio.h>
#include <unistd.h>
void f(int n)
{
printf ("Number: %d\n", n);
}
int main(int argc, char * argv[])
{
int i = 0;
printf ("f() is at %p\n", f);
while (1)
{
f (i++);
sleep (1);
}
}
다음 명령어로 컴파일한다.
$ gcc -Wall hello.c -o send\_hello
./send\_hello
실행을 하게 되면 %p(포인터) 포맷스트링으로 f()함수의 주소가 출력되고 1초마다 증가하는 정수를 확인할 수 있다.
2. 후킹 함수 작성(hook.py)
from __future__ import print_function
import frida
import sys
session = frida.attach("hello")
script = session.create_script("""
Interceptor.attach(ptr("%s"), {
onEnter: function(args) {
send(args[0].toInt32());
}
});
""" % int(sys.argv[1], 16))
def on_message(message, data):
print(message)
script.on('message', on_message)
script.load()
sys.stdin.read()
python hook.py 0x10438
호출되는 함수를 후킹하여 출력하도록 script를 작성하였다.
3. 함수 조작(modify.py)
import frida
import sys
session = frida.attach("hello")
script = session.create_script("""
Interceptor.attach(ptr("%s"), {
onEnter: function(args) {
args[0] = ptr("1337");
}
});
""" % int(sys.argv[1], 16))
script.load()
sys.stdin.read()
python modify.py 0x10438
후킹 스크립트가 실행되는 동안 Number의 값이 '1337'로 변조되었다.
4. 함수 호출(call.py)
import frida
import sys
session = frida.attach("hello")
script = session.create_script("""
var f = new NativeFunction(ptr("%s"), 'void', ['int']);
f(1911);
f(1911);
f(1911);
""" % int(sys.argv[1], 16))
script.load()
python call.py 0x10438
원하는 만큼함수를 호출할 수도 있다.
반응형
'Reversing' 카테고리의 다른 글
[Frida] Hooking send(), recv() (0) | 2022.05.10 |
---|---|
[Frida] Binary Hooking 2 (0) | 2022.05.03 |
DLL Injection 실습 (0) | 2020.12.14 |
[Reversing] Windows 10 Anti-Reversing 기법 2 (0) | 2020.12.10 |
[Reversing] Windows 10 Anti-Reversing 기법 1 (0) | 2020.12.09 |