[๊ณผ์ ์ ๋ฆฌ] SSL library hooking
FILE HOOK์ ์์ ํด์ SSL ํต์ ๊ณผ์ ์ ๋ก๊ทธ๋ก ๋จ๊ธฐ๋ ์ฝ๋๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒ์ด ๊ณผ์ ์๋ค.
์ฐ์ ์๋๋ SSL์ฝ๋๋ฅผ ์ถ๊ฐํ hook.c ์ฝ๋์ด๋ค.
#hook.c
#define _GNU_SOURCE
#include<stdio.h>
#include<dlfcn.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/ssl.h>
extern char * __progname;
static int (*hook_SSL_read)(SSL *ssl, char *buf, int num) = NULL;
//SSL_read hooking
int SSL_read(SSL *ssl, void *buf, int num){
//SSL_read ์ ์์ ์ผ๋ก ๋์ํ๊ฒ๋
if (hook_SSL_read == NULL) hook_SSL_read = dlsym(RTLD_NEXT, "SSL_read");
char* buf_ = buf;
//hookingํ ๋ด์ฉ์ txt๋ก ์ ์ฅ๋๋๋ก
FILE *fp = NULL;
if ( fp = fopen("/tmp/hook.txt", "a+")){
fprintf(fp, "%s", buf_);
}
fclose(fp);
//return hook_ret;
return hook_SSL_read(ssl, buf, num);
}
void __attribute__ ((constructor)) before_load(void)
{
if (hook_SSL_read == NULL)hook_SSL_read = dlsym(RTLD_NEXT, "SSL_read");
}
wget ๊ธฐ๋ฅ์ ์กด์ฌํ๋ opensslํจ์์์ ์๋ SSL_read ํจ์๋ฅผ ๋ณํํ์ฌ ์๋ ํจ์๋ ์ ์์ ์ผ๋ก ๋์ํ๊ณ ๋์ํ๋ ๋ด์ฉ์ ๋ก๊ทธ ํ์ผ๋ก ์ ์ฅ์ด ๋๊ฒ๋ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
ํจ์์ ์ด๋ฆ์ ์ ๋ ฅํ๋ฉด ์ฃผ์๋ฅผ returnํด์ฃผ๋ dlsym ํจ์๋ฅผ ์ฌ์ฉํ์๊ณ , ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ๋์ด ์๋ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ด๊ฐ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฃผ์๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋๋ก RTLD_NEXT ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์๋ค.
์ฒ์์๋ ./run.sh๋ก ์คํ์ ์์ผ๋ณด๋ ค๊ณ ํ์ง๋ง /etc/ld.so.preload์ write๊ฐ ๊ณ์ ๋์ง ์์ LD_PRELOAD๋ฅผ ์ฌ์ฉํ์๋ค.