Pwnable

Pwnable/Techniques

FPO

FPO(Frame Pointer Overflow) 기법은 다음과 같은 조건에서 유효하며 사용가능하다. - main 함수 이외에 하나 이상의 sub 함수가 존재해야 한다. - SFP의 마지막 1byte를 변조할 수 있어야 한다. 일반적인 스택의 상황이 아닌 SFP 의 마지막을 변조한 상태의 스택을 나타낸 것이다.

Pwnable/Techniques

Prologue & Epilogue

void function_1(**argv) {} int main() { function_1(argv); } 위와 같은 소스코드를 가진 프로그램을 실행했을 때 Stack Frame 에 어떠한 값들이 저장되고 각 레지스터들이 어느 위치를 가리키는지 알아보자.

Pwnable/HackCTF

Beginner_Heap

64bit + Heap 영역 문제이다. Heap 영역은 Stack 영역과 다르게 메모리가 낮은 주소 → 높은 주소 로 자란다는 것을 기억하자. 우선 beginner_heap.bin 바이너리 파일을 분석해보자. main 함수부터 보자. 첫번째 fgets 로 입력받는 값은 v3 + 1 에 저장되고, 두번째 fgets 로 입력 받는 값은 v4 + 1 에 저장된다. 첫번째 입력에서 v3, v3 + 1, v4 를 NOP 로, v4 + 1 을 exit_got 로 입력해주면 될 것 같다. 메모리 구조를 살펴보자. —————————— High Address | v4 + 1 (8) | —————————— | v4 (16) | —————————— | v3 + 1 (8) | —————————— | v3 (16) |..

Pwnable/HackCTF

Simple_Overflow_ver_2

x86 바이너리인데 x64 바이너리로 착각해서 디컴파일하는데 개고생했다. Simple_Overflow 답게 보호기법이 아무것도 적용되어 있지 않다. 주소값이 달라지는 것을 보아하니 ASLR만이 존재한다. 코드를 봐보자. 코드 분석만 조금 고민하면 쉽게 exploit 코드를 짤 수 있다. 버퍼의 주소를 얻는 코드가 버퍼에 문자열을 입력받는 코드보다 아래에 있으므로 우선 버퍼의 주소를 얻어놓은 다음에 while 문을 한 cycle 돌려서 그 다음번 while 문에서 payload를 전달하면 될 것 같다. from pwn import * r = remote("ctf.j0n9hyun.xyz", 3006) #Get buffer address r.recvuntil("Data : ") r.sendline("AAAA"..

Lucvs
'Pwnable' 카테고리의 글 목록 (2 Page)