티스토리 뷰
쉘 코드가 nullbyte를 갖고 있을 때, strcpy와 같은 문자열 함수를 호출할 때 모든 내용이 복사되지 않을 수 있다.
( -> strcpy 함수는 복사되는 크기가 정해져있지 않고, \00(NULL)을 만날 때까지 실행된다.)
따라서 nullbyte를 제거한 쉘 코드를 구해야 한다.
쉘을 실행시키는 기존의 c 코드는 다음과 같다.
execve의 인자로 argv[0],argv,NULL이 차례로 정해진다.
어셈블리어로 이를 생각하여 보면, 첫 번째 인자는 ebx, 두 번째 인자 ecx, 세 번째 인자는 edx에 삽입되어 사용된다.
(어쩔수없는것, 정해져있음)
위의 코드에서 널 바이트를 제거한 어셈블리 코드는 위와 같다.
xor %eax, %eax
-> 이를 통하여 eax레지스터에 0의 값을 저장시킬 수 있다. 원래로라면 mov 0x0, %eax와 같은 명령어를 통하여 0을 저장할 수 있지만, 이런 방법으로 실행시켰을 때 널 바이트가 발생한다.
또한 스택에 /bin//sh 문자열을 직접 넣어주는 과정이 필요하므로
(/bin/sh도 가능하지만 크기를 맞춰주고자 /bin//sh를 이용함)
Push $0x68(h)73(s)2f(/)2f(/) … 와 같이, 리틀앤디안 방식을 이용하여 스택에 push한 후,
Mov %esp, %ebx 명령어를 통해 push한 문자열을 ebx 레지스터에 넣어 준다.
그 후 syscall을 통하여 쉘 코드를 실행시켜 주는데, 실행할 syscall 번호를 al(eax) 레지스터에 넣어 주어야 한다.
이 때 execve syscall이 실행되므로, 이의 syscall number를 알아야 한다.
-> (https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md)
위에서 시스템 콜 번호를 찾을 수 있었다. (32bit)
따라서 11을 eax 레지스터에 삽입해 주어야 하는데, 16진수로 변환하면 0xb값을 가진다.
movb $0xb, %al
-> 이와 같이 movb 명령어를 사용하는 이유는, 0xb의 크기는 1byte이기 때문에 bite 단위를 저장시키는 movb 명령어를 사용하였다.
만약 movb 명령어가 아닌 mov $0xb, %eax 명령어를 사용한다면, eax 레지스터의 크기는 32byte이며, mov 명령어 또한 32byte를 저장시키기 때문에 eax 레지스터에 0x000000b 가 저장된다. 즉 널바이트가 존재하기 때문에 movb 명령어를 통하여 1byte의 크기를 갖고 있는 %al 에 넣어준다.
그 후 shellcode.c 를 컴파일한다.
gcc -m32 shell.c -o shell
컴파일한 후 실행 파일의 operation code를 objdump -d를 통하여 보면,
이 중, xor 명령어 이전의 부분은 main 함수의 프롤로그 부분이며, 인터럽트 이후의 부분은 필요가 없으므로
다음과 같은 코드를 구할 수 있다.
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”
'hacking > system' 카테고리의 다른 글
함수 프롤로그/에필로그 (0) | 2020.11.06 |
---|---|
bof에 환경 변수 사용하기 (0) | 2020.08.23 |
Buffer overflow (0) | 2020.08.23 |
ROP(return-oriented programming) 공부하기 .. (완x) (0) | 2020.08.16 |
- Total
- Today
- Yesterday
- 위상 정렬
- 비트마스킹
- Priority Queue
- Segment Tree
- 부분 합
- MaxHeap
- 배낭 문제
- 희소 배열
- 백트래킹
- Sort
- Greedy
- 완전 탐색
- LowerBound
- 누적 합
- 분할정복
- RequiredArgsConstructor
- HashSet
- 구간 합
- 이분탐색
- MinHeap
- prirotyqueue
- dfs
- 최단 거리
- 동적계획법
- 분할 정복
- Knapsack
- 페르마의 정리
- 완전탐색
- dp
- 참조 지역성
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |