본문 바로가기

분류 전체보기

(32)
Layer7 - 날먹 보호되어 있는 글입니다.
Layer7 - GOT Overwrite 보호되어 있는 글입니다.
PLT, GOT, x64 or x86 RTL 보호되어 있는 글입니다.
Layer7 - 포너블 4차시 과제 보호되어 있는 글입니다.
Layer7 - 포너블 3차시 과제 0솔브 방지 문제 버퍼주소 그냥 주니까 딱봐도 쉘코드 넣는거다. 함수 시작부분을 보면 알겠지만 v5에 무슨 값을 넣고 어셈으로 보면 이렇다. 이 값은 에필로그에서 변조되었는지 비교한다. 카나리가 걸려있는 것이다. 따라서 카나리를 leak해야 한다. 입력을 두번 줄 수 있고 심지어 첫번째 입력은 출력까지 해준다. 버퍼가 꽉찼을때 카나리가 leak되는걸 방지하기 위해서 카나리의 첫번째 바이트는 항상 NULL인데 딱 그 널까지만 덮어주면 카나리가 같이 딸려서 출력이 된다. 릭했으면 그 카나리 이용해서 return to shellcode하면 된다. from pwn import * context.arch = "amd64" r = remote("pwn.scalart.me", 9001) r.recvuntil("add..
Layer7 - 포너블 2차시 수업 + 과제 이름만 봐도 ezpzzzlol한 문제들이 수업 + 과제 용으로 올라와있길래 보자마자 10분 스피드런 하려 했지만 총 16분 걸렸다.. 조금 더 빡겜했으면 충분히 10분컷 할 수 있었는데 아쉽다. 스피드런도 은근 재밌는것 같다. change_ret32 대놓고 주는 BOF와 대놓고 주는 셸 함수.. 이름에서 알 수 있듯이 return address변조하면 끝난다. 버퍼가 ebp-0x14이고 32비트 바이너리니까 return address는 ebp+4에 위치하므로 더미를 0x18만큼 주고 원하는 주소 주면 rip변조 된다. 아니 근데 플래그를 좀;; 도커로 분리 해주세요;;; change_ret64 앞에 문제랑 똑같다. 차이점은 32비트냐 64비트냐 이다. 얘도 주니까 더미 0x28만큼 주고 함수주소 넣어주면..
Layer7 - 포너블 1차시 과제 보호되어 있는 글입니다.
Layer7 - 포너블 1차시 수업 문제 3개 전부 합쳐서 실행 한번도 안해보고 5분컷 냈다. ezpzzzlol HackCTF극초반 느낌 난다. bof_basic v5변수만 맞춰주면 풀린다. 음수를 h키 눌러서 hex로 바꾸면 이렇게 되고 0x34-0xc만큼 더미 넣어주고 저 값 넣어주면 된다. from pwn import * r = remote("pwn.scalart.me", 8001) r.sendline(b"a"*(0x34-0xc)+p32(0xDEADBEEF)) r.interactive() bof_basic2 함수포인터 주고 셸함수 주니까 그냥 함수포인터 덮으면 된다. 마찬가지로 버퍼가 ebp-0x8c에 있고 함수포인터가 ebp-0xc에 있으므로 0x8c-0xc만큼 더미 주고 셸함수 주소 넣어주면 된다. from pwn import *..
Layer7 - 리버싱 11차시 과제 prob-3 __int64 __fastcall run_cpu(unsigned __int64 *a1) { __int64 result; // rax __int64 v2; // rsi unsigned __int64 *v3; // rdx unsigned __int64 *v4; // rdx unsigned __int64 *v5; // rdx unsigned __int64 *v6; // rdx unsigned __int64 *v7; // rdx unsigned __int64 *v8; // rdx unsigned __int64 *v9; // rax unsigned __int64 *v10; // rdx unsigned __int64 *v11; // rdx unsigned __int8 v12; // [rsp+9h] [r..
Layer7 - 리버싱 10차시 과제 prob-begin main함수에선 16바이트를 입력받고 initcpu함수로 값을 복사한다. 그리고 복사한 값을 runcpu함수로 전달한다. runcpu함수를 보면 전형적인 vm문제이다. stub배열에 있는 값을 opcode로 사용하고 opcode에 따라서 우리가 입력한 값에다가 덧셈, 뺄셈, xor, or등 다양한 연산을 수행한다. 일단 여기까지만 봤을때 IDA가 잘못 해석한게 있다. 포인터 연산을 할때 인덱스에다가 4를 곱하니까 이 함수에 전달되는 인자는 __int64가 아니라 그냥 int타입이다. 그리고 runcpu함수에 전달되는건 포인터니까 runcpu의 매개변수인 a1변수도 __int64 a1에서 int a1로 바꿔준다. 이렇게 잘못 해석된 변수들의 타입을 바꿔주면 우리가 보기 편하게 표시가 된..