opcode 목록을 생성하기 위한 셸을 빌드하고 싶기 때문에 아래 코드의 <__execve>에 대한 어셈블리 지침을 얻으려고 합니다.
#include <stdio.h>
int main()
{
char *happy[2];
happy[0] = "/bin/sh";
happy[1] = NULL;
execve (happy[0], happy, NULL);
}
Objdump는 나에게 이것을 제공합니다 :
8053a20: 53 push %ebx
8053a21: 8b 54 24 10 mov 0x10(%esp),%edx
8053a25: 8b 4c 24 0c mov 0xc(%esp),%ecx
8053a29: 8b 5c 24 08 mov 0x8(%esp),%ebx
8053a2d: b8 0b 00 00 00 mov $0xb,%eax
8053a32: ff 15 a4 d5 0e 08 call *0x80ed5a4
8053a38: 3d 00 f0 ff ff cmp $0xfffff000,%eax
8053a3d: 77 02 ja 8053a41 <__execve+0x21>
8053a3f: 5b pop %ebx
8053a40: c3 ret
8053a41: c7 c2 e8 ff ff ff mov $0xffffffe8,%edx
8053a47: f7 d8 neg %eax
8053a49: 65 8b 0d 00 00 00 00 mov %gs:0x0,%ecx
8053a50: 89 04 11 mov %eax,(%ecx,%edx,1)
8053a53: 83 c8 ff or $0xffffffff,%eax
8053a56: 5b pop %ebx
8053a57: c3 ret
8053a58: 90 nop
8053a59: 90 nop
8053a5a: 90 nop
내가 읽은 몇 가지 기사에서 다음과 같은 내용이 나와야 합니다.정수 0x80위 출력 어딘가에 있습니다. 왜 하나도 없나요?
3.2 3~4년 전에 쓰여진 책에 제시된 쉘코드 구축 알고리즘(특정 레지스터 로드 등)에 영향을 미칠 수 있는 시스템 호출 작동 방식과 관련하여 커널에 중요한 변경 사항이 있습니까? 위의 덤프는 "Shellcoders Handbook" 또는 "Smash the Stack"에 제공된 출력과 매우 다르게 보입니다.
감사해요!
답변1
시스템 호출 구현은 하드웨어에 크게 의존합니다. Wikipedia 기사를 참조하세요.시스템 호출그리고 약커널 트랩. 최신 x86에서는 int 0x80
최신 버전을 위해 버려진 것 같습니다.SYSENTER
외.전자.
나에게 있어서 __execve는 다음과 같다:
000000000040f7c0 <__execve>:
40f7c0: b8 3b 00 00 00 mov $0x3b,%eax
40f7c5: 0f 05 syscall
40f7c7: 48 3d 00 f0 ff ff cmp $0xfffffffffffff000,%rax
40f7cd: 77 02 ja 40f7d1 <__execve+0x11>
40f7cf: f3 c3 repz retq
40f7d1: 48 c7 c2 c0 ff ff ff mov $0xffffffffffffffc0,%rdx
40f7d8: f7 d8 neg %eax
40f7da: 64 89 02 mov %eax,%fs:(%rdx)
40f7dd: 48 83 c8 ff or $0xffffffffffffffff,%rax
40f7e1: c3 retq
40f7e2: 66 90 xchg %ax,%ax
40f7e4: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
40f7eb: 00 00 00
40f7ee: 66 90 xchg %ax,%ax
syscall
시작 부분 에 주의하세요 . 이 함수의 정확한 형식은 컴파일 플래그와 코드가 컴파일되는 아키텍처에 따라 다릅니다. gcc
옵션 -mtune
및 을 참조하세요 -march
.
편집하다:다른 흥미로운 링크: