Pwnable

Pwnable/HackCTF

BOF_PIE

main 함수이다. welcome()을 function call 한다. welcome() 함수이다. 문자열 두줄 출력 뒤 v1에 입력을 받는다. j0n9hyun 함수는 flag를 출력하는 함수이다. 간단하게 welcome 함수의 RET을 j0n9hyun의 주소로 덮으면 될 것 같다. 각 함수들의 심볼들을 이용하여 offset을 계산한 뒤, j0n9hyun 함수의 주소를 payload에 넣으면 될 것 같다. (메모리 구조 생략) 다음과 같이 offset을 구한다. gdb 로 분석하였을 때 welcome 함수가 j0n9hyun 함수보다 상대적으로 고주소이기 때문에 welcome의 주소에서 offset을 빼주어 j0n9hyun 함수의 주소를 구하여 payload에 넣어준다. from pwn import * r..

Pwnable/HackCTF

Offset

main 함수이다. gets로 입력받고 select_func()로 넘어간다. select_func() 이다. 31 bytes 만큼 src에서 dest에 복사한다. 또한 마지막에 v3()를 return 한다. 여기서 dest와 v3 의 거리가 30 bytes 차이나고 처음에 v3 = two 로 초기화한다. 그리고 31 bytes 만큼 src에서 복사를 하여 dest에 저장하므로 여기서 v3의 마지막 1 byte가 overwrite 된다. 이를 이용하여 src의 31번째 byte가 다른 함수의 offset 이라면 마지막에 v3가 return 될 때 two 가 아니라 그 다른 함수가 실행될 것이다. flag를 바로 출력시켜주는 함수인 것 같다. one / two 각 함수들의 주소들이다. 문제의 초점인 offs..

Pwnable/HackCTF

내 버퍼가 흘러넘친다!!!

입력을 두 번 받는 것 빼고는 간단한 BOF 문제이다. name이라는 변수가 어디에 저장되어 있는지를 찾고 여기에 NOP + shellcode 를 삽입, RET을 &name으로 바꾸어주면 쉘이 따질 것이다. name 변수는 bss 영역에 존재한다. 전역변수 중에서 초기화된 변수는 data 영역에, 초기화되지 않은 변수는 bss영역에 들어간다고 한다. &name → 0x0804a060 payload를 작성하고 exploit 코드를 짜자. from pwn import * r = remote("ctf.j0n9hyun.xyz", 3003) r.recvuntil(": ") name = "\x90"*20 name += "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\..

Pwnable/HackCTF

Basic_FSB

이번 문제는 GOT Overwrite를 이용한 Format String Bug 문제이다. ida로 basic_fsb.dms바이너리파일을 분석한 결과를 보자. 디컴파일된 코드를 보면 우선 main 함수에 vuln() 함수가 호출되고 vuln() 함수에서는 s에 입력을 받고 printf 함수를 통하여 출력한다. 기존의 printf 사용과는 달리 FSB 환경(" " 사용 X)이 주어져있기 때문에 다음과 같이 해결할 수 있다. printf 함수의 GOT 주소를 쉘을 실행시키는 함수의 주소로 덮는다. GOT Overwrite 가 되었으면 printf(&format) 코드가 실행될 때 쉘실행 함수가 실행될 것이다. flag라는 멋있는 함수가 들어있다. 이제 이 함수의 주소를 구해보자. → 0x080485b4 FSB..

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