1. 리눅스로 파일을 받으면?
1) file 명령어를 통해 파일 정보를 확인한다.
- 시그니처를 파싱해서 보여줌. (파일정보, 아키텍처 정보등등)
2) strings 명령어를 통해 파일의 정보를 확인한다.
- 라이브러리 함수 같은 정보들도 알 수 있음
2. 대부분의 함수는 libc라이브러리 안에 포함되어있다.
- 카피 strcpy, strncpy, memcpy
- 비교 strcmp, strncmp, memcmp
- 길이 strlen
- 메모리 : malloc, free
- 기타 : sleep..
3. IDA에서는 배열, 포인터, 심볼, 라이브러리에 대한 정보는 내가 바꿔줘야 한다.
4. IDA에서 FLIRT를 사용하라. 특정 함수에 대해 알아서 시그니처를 만들어준다 (MS, libc)
5. C++과 별차이는 없다. virtual 함수만 다른 곳에 정의를 한다.
new와 delete는 결국 함수 내부를 보면 malloc와 free를 호출한다.
6, 쉘코드란?
bin/sh
백도어 역할을 한다. bind방식과 reverse 방식
보통은 간단한 쉘코드를 전송한 뒤 메모리를 크게 할당하여 2차쉘코드를 다운받는다.
7. x86의 시스템 콜은? int 0x80 또는 sysente(지원할 경우)
리눅스의 경우 eax, ebx, ecx, esi, edi, ebp에 저장한 후 스택에 쌓인다.
리턴값은 eax로
64bit는? syscall 로 호출
리눅스의 경우 rdi, rsi, rdx, r10, r8, r9를 인자로 먼저 넘긴다.
리턴값은 rax
8. execl, execle, execlp, execv, execve, execvp 차이는?
lv : 커맨드를 list 또는 vector로
e : 환경변수도 포함
p : PATH 변수를 사용
#include <unistd.h>
int execve(const char *filename, char *const argv[], char *const envp[]);
9. 다음을 컴파일 하면 쉘코드를 만들어낼 수 있다.
#include <unistd.h>
int main(void){
char* argv[] = { "/bin/sh", NULL };
execve("/bin/sh", argv, NULL);
// int execve(const char *filename, char *const argv[], char *const envp[]);
}
10. GDB 명령어
아키텍처 설정 set disassembly-flavor intel
기본 : run (r), continue (c), quit (q)
인자는 run args
파일 또는 스탠다드 입출력
run args < input
run args < input > output
실행중인 프로세스 (파이썬으로 실행하고 attach로 잡자)
attach pid
현재 프로세스 정보
info proc
현재 프로세스 메모리
info proc map
브레이크
b function_name / b *address
함수 내부로
step (s)
함수 건너서
next (n)
프로세스 한개 : si, ni
지금까지 호출한 것 확인 : bt 백트레이스
스택프레임 위 아래 up, down
메모리 정보 : x/200x 0x1014024
포인터에 저장된 메모리 값 : p/x 변수명
다음에 실행할 위치 정보 : x/ni $pc
매번 실행할 때마다 보여주기 display/i $pc
모든 레지스터 i r
11. pwndbg
개짱이다. 다운받고 쓰자. 이거는 할떄마다 메모리 정보 레지스터 정보 다보여준다. 그냥 짱
https://github.com/pwndbg/pwndbg
12 취약점은 5가지로 분류할 수 있다
1) Memory corruption
메모리 할당후 그 이상 사용(보통 인자로 크기를 넘겨줄 때 다른 크기 변수를 사용하던가 계산함)
char *img = malloc(width * height);
for (i = 0; i < height; ++i)
memcpy(&img[i*width], &src[i*width], width);
delete obj;
obj->do_stuff(); 재사용
2) Logic erros (허용되지 않는 입력값으로 로직을 변경)
문자열 비교를 잘못하여 허용되지 않은 사이트도 접근해줌
whitelist = [“home.php”, “upload.php”, “download.php”]
for page in whitelist:
if strncmp(page, target, strlen(page)) == 0:
return OK
Retrun ERROR
이유 target의 값이 이러면? /home.php/.../.../... 하위 페이지 접속 가능
3) Information Leakage (얻을 수 없는 정보를 누출, Heart bleed)
이유 : ./uploads/ .. / .. / .. / 이러면 파일 다 가져올 수 있음
char buf[24];
strncpy(buf, src, sizeof(buf));
printf(“You typed %s\n”, buf);
이유 마지막이 null아니면 다 찍어냄
4) command / code injection
쉘 os.system(“sendmail %s < message.txt” % email_addr)
디비 db.query(“SELECT name FROM user_tbl WHERE email=%s” % email)
코드 render(“Hello, %s! Welcome to {{ site.name }}” % name)
5) resource exhaustion
크래시, (a+)+이상한 정규표현식, 무한루프
13 최초 버퍼오버플로우는?
get 함수, 널바이트 들어올 때 까지 입력받음
'리버싱 > 리버싱기초' 카테고리의 다른 글
DLL(Dynamic-link library) 동적 분석 방법 (2) | 2016.03.07 |
---|---|
리버싱 예제 2 (정적분석 vs 동적분석) (0) | 2015.10.14 |
PE파일 데이터 암호화 (0) | 2015.10.05 |
PE파일 구조 (0) | 2015.09.23 |
리버싱 예제 1 (라이센스 우회) (1) | 2015.09.15 |