Pwnable/HackCTF

Pwnable/HackCTF

ROP

아주 typical한 ROP 형식의 문제이다. ROP는 RTL Chaining + GOT Overwrite + Gadget 을 알고 있다면 각 함수들의 주소값들과 gadget의 주소를 조합하여 작품을 완성하는 퍼즐과도 같다. 퍼즐의 조각들을 하나하나씩 모아보자. read_plt = 0x08048300 read_got = 0x0804a00c write_plt = 0x08048340 write_got = 0x0804a018 bss → 0x0804a024 read_offset = 0xd4350 system_offset = 0x3a940 pop pop pop ret Gadget → 0x08048509 from pwn import * r = remote("ctf.j0n9hyun.xyz", 3021) #PUZZLE..

Pwnable/HackCTF

RTL_World

main함수의 모습이다. 메뉴를 선택받고 그 메뉴를 실행한다. Menu 함수의 모습이다. 보스의 바이너리 정보 돈 만들기 등등이 있다. 2번 메뉴인 Get_Money 함수이다. 이것으로 돈을 획득할 수 있을 것 같다. 제일 먼저 이 바이너리의 정보를 확인하여보자. NX와 ASLR 기법이 적용되어있다. ASLR 기법이 적용되어 있다면 프로세스마다 스택의 주소값이 랜덤 맵핑되기 때문에 한번의 실행에서 모든 것을 수행해야 주소값이 바뀌는 것을 막을 수 있다. 자 이제 문제를 어떻게 해결할 것인지 알아보자. 우선 RTL chaning을 이용해야 하므로 이에 필요한 함수들의 주소값을 먼저 구해야 할 것이다. 3번과 4번 메뉴를 이용하여 system 함수와 "/bin/sh" 문자열의 주소를 얻을 수 있다. 하지만 ..

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..

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