목록분류 전체보기 (117)
EYEN
안녕하세요 64bit 알오피문제 발표를 맡은 이예은입니다.순서는 c코드의 흐름을 먼저 보고, 환경설정에 관련된 익스플로잇과 시스템 빈쉘을 스택에 주입하는 과정의 익스플로잇을 보겠습니다 먼저 c코드인데요. c는 무조건 main함수부터 시작하므로 main함수부터 보겠습니다. main함수에서 initialize를 실행하죠. 그리고 initialize함수에서는 signal이라는 함수에서 alarm_handler라는 함수를 인자로 갖는 것을 볼 수 있습니다. signal이라는 함수는 인터럽트의 여부로 함수의 분기를 결정하는 부분이라고 할 수 있는데요. 입력이 있으면 기존의 흐름에 따라 read,write를 실행하고 입력이 없으면 alarm_handler를 통해 puts라는 함수를 실행시키겠네요. 다음은 익스플로잇..

일단 카나리 관련 토픽을 찾는 게 힘들더라구요.그래서 드림핵 내용인 canary 생성과정에 대해 정리해봤습니다. 예제입니다#include int main() { char buf[8]; read(0, buf, 32); return 0;} 문자열 버퍼를 8만큼 할당해주고, 32만큼 입력받아서 buf에 저장하는 것을 볼 수 있습니다. 두 부분이 카나리에 관련된 부분입니다. main+8에서 fs:0x28에서 8바이트를 가져와서 rax에 넣고,main+17에서 rax의 값을 rbp-0x8에 8바이트만큼 넣는 것을 볼 수 있습니다. 그리고 이때 rax의 값은 첫바이트가 널바이트인 8바이트 데이터임을 알 수 있습니다. 나중에 main+50에서 rbp-0x8에 저장된 카나리를 rcx로 복사하고,main+54에..
보호되어 있는 글입니다.
보호되어 있는 글입니다.
보호되어 있는 글입니다.
보호되어 있는 글입니다.

목적쉘따기 = system(/bin/sh)인자가 /bin/sh 일 때, 실행되는 함수가 system인자 자리 하나, 실행되는 함수 자리 하나를 조작할 수 있어야함. 이때 puts 활용해서 ret2main 이때 pop rdi ret rsi ret으로 rdi를 0으로, rsi를 buf으로, ret을 read@got로 덮어서 read 한번 더 쓰고(/bin/sh)rdi를 1로, rsi를 write@got 주소로, ret을 read@got로 덮어서 read 한 번 더 쓰고(system)그리고 write@got 실행 rdi를 0으로 rsi를 read@got로 ret을 puts@plt으로 덮어서 한번 되돌아가그리고 메인 함수 주소를 적어 from pwn import * p=remote("host3.dreamha..

카나리 정적 분석카나리를 활성화하여 컴파일한 바이너리와 비활성화하여 컴파일한 바이너리를 비교하여 스택 카나리의 원리를 살펴보겠다. main 함수의 프롤로그 0x00000000000006b2 : mov rax,QWORD PTR fs:0x28 0x00000000000006bb : mov QWORD PTR [rbp-0x8],rax 0x00000000000006bf : xor eax,eaxfs:0x28의 데이터를 읽어서 rax에 저장한다.fs는 세그먼트 레지스터의 일종으로, 리눅스는 프로세스가 시작될 때 fs:0x28에 랜덤 값을 저장한다. 따라서 rax에는 리눅스가 생성한 랜덤 값이 저장된다. 생성한 랜덤값은 rbp-0x8에 저장된다 *리눅스는 fs..