전체 글
-
[bcactf] Got libc?CTF/pwn 2022. 6. 8. 16:22
Got libc? 이름부터 got plt와 libc를 활용할 것 같은 느낌이 든다. 메인 함수에서는 gets() 함수를 실행시키고 코드가 끝난다. 그런데 입력받을 배열이 보이지 않아 gdb로 다시 봐봤다. 배열의 위치는 rbp-0x20이다. 오버플로우를 일으켜 여러 정보를 leak 하고 최종적으로는 system("/bin/sh")를 실행시켜야 한다. 다행히도 pie와 canary는 없다! 우선, ROP에 필요한 gadget들을 알아내야 한다. 64비트의 인자 전달 순서는 rdi, rsi, rdx ... 순서이다. 편의상 인자가 하나만 필요한 puts와 system을 이용해 leak을 할 것이기에 pop rdi; ret만 가져왔다. puts의 got를 인자로 넘겨 puts 함수를 실행시켜 실제 주소를 알아..
-
[bcactf] Jump RopeCTF/pwn 2022. 6. 8. 16:00
Jump Rope tmi로 초등학교 때 줄넘기 쌩쌩이를 하지 못해 수행평가를 힘들어 했던 기억이 있다. main 함수에서는 jumprope함수를 호출하고 종료된다. 그런데! jumprope 함수에서는 gets로 입력받기에 bof를 노려볼 수 있다. a라는 함수가 플래그를 출력해주니 jumprope의 ret를 a의 시작 주소로 바꾸면 될 것이다. pie나 canary가 걸려있지 않아 bof하기 쉬울 것이다. 200 바이트 + sfp 8바이트, 총 208 바이트의 더미를 입력하고 a의 시작 주소를 적어주었다.
-
[bcactf] BOF ShopCTF/pwn 2022. 6. 8. 15:49
제목에서부터 알 수 있듯이 이 문제는 BOF 문제이다. balance의 값이 100이면 플래그를 출력해준다! gdb로 확인해봤을 때, name을 입력하는 곳은 rbp-0x80 위치이다. 변수 balance는 rbp-0xc 위치에 있다. 입력 길이에 제한이 없는 gets로 입력받기에 오버플로우를 시키며 rbp-0xc 위치에 있는 balance에 100을 넣어주면 플래그가 출력이 될 것이다. 위와 같이 0x74만큼의 더미 값을 입력하며 balance 위치에 100을 넣어주었다.
-
-
[b01lers ] gambler-overflowCTF/pwn 2022. 5. 8. 23:14
gambler-baby와 마찬가지로 main함수에서는 casino 함수를 실행시킨다. baby와 다른 점은 srand로 seed를 바꿔준다는 점이다. 실행시킬 때마다 랜덤으로 생성된 단어가 달라지는 것을 확인할 수 있다. 이름부터 예상할 수 있듯이 이번 문제는 Buffer Overflow(bof)를 이용해야한다. 18번째 줄을 보면 입력값 개수에 제한을 두지 않는 gets 함수를 통해 입력받는 것을 확인할 수 있다. Return Oriented Programming(ROP)를 이용하기에는 canary가 걸려있다. 그럼 어떡해야할까? 다시 함수를 잘 봐보자. 랜덤으로 생성된 글자는 배열 s에 담겨있고, 우리가 입력할 곳은 배열 s2이다. s의 위치는 rbp-0x10, s2의 위치는 rbp-0x18로 s2를..
-
[b01lers ] gambler-baby1CTF/pwn 2022. 5. 8. 22:54
main 함수이다. casino 함수를 실행시키고 끝나는 간단한 코드이다 casino 함수이다. 랜덤한 알파벳을 4개 생성하여 추측하고 일정 이상의 돈을 지니면 flag를 출력하는 프로그램이다. bof도 불가능 하고, pie가 걸려있어 주소 leak도 되지 않아 언뜻 보면 어떻게 맞출지 막막하겠지만 이 코드에는 치명적인 오류가 있다. 그건 seed 값을 초기화 시키지 않아 프로그램을 몇 번을 실행시켜도 같은 순서로 랜던값이 생성된다. 이를 이용해 10번의 기회를 이용해 10개의 단어를 알아내고 프로그램을 종료시킨다. 다음 실행 때는 10번 + 10번으로 이후의 10개의 단어를 알아내고 또 다음 실행 때는 20번 + 10번으로 이케저케 반복 작업을 통해 단어를 알아낸다. 위의 내용을 바탕으로 한 페이로드이다.