CTF/pwn
-
[GDG] MindGame (부제: 파이썬에서 c 함수 실행시키기)CTF/pwn 2022. 10. 10. 17:52
개강을 하고 현생에 치이느라 오랜만에 글을 작성한다...! 이번 GDG ctf에서 새로운 파이썬 모듈을 알았기에 글을 적어보려고 한다. 메인 함수에서는 랜덤값을 할당해주고, 입력값과 같은지 체크한다. 난수와 입력값이 같다면, flag 함수를 실행시킨다. scanf의 bof를 통해 난수가 저장되는 변수를 덮을 수 있나 했지만.... 입력 후에 rand로 난수를 할당해주기에 그 방법은 아니었다. 보통 이런 문제는 랜덤 시드값이 일정해 난수 생성 패턴이 일정하다는 취약점이 있지만, srand(time(NULL))을 통해 랜덤 시드를 초기화 시켜주고 있다. 첫 번째로 생각한 방법은 랜덤값을 초기화 해주는 c 파일을 작성한 후에, c 파일의 출력값을 파이썬으로 전달하는 방법을 생각해봤다! 위와 같이 파일을 두 개..
-
[bcactf] Format FortuneCTF/pwn 2022. 6. 8. 18:02
소스코드이다. 15번째 줄에서 fsb가 발생한다. 그리고 19번째 줄에서 magic의 값이 0xbeef이면 플래그를 출력해준다. magic의 위치는 0x40408c이다. PIE가 없기에 주소를 알아낼 필요는 없을 것 같다 입력 받는 배열의 위치는 6번째(0x4141...)에 있다. 이를 바탕으로 진행해보자. 32비트와 64비트 모두에서 fsb가 발생하지만 64비트에서는 약간의 차이점이 있다 64비트에서는 8바이트씩 데이터를 넣기 때문에 주소값을 입력할 때 NULL(\x00)이 들어간다 이것은 입력 때는 문제 없이 들어가지만 NULL까지 출력하는 printf 특징 때문에 NULL 뒤에 나올 코드가 실행이 되지 않는다. 그래서 위처럼 쓸 수 있는 코드를 위처럼 바꿔줘야 한다. bbbbb를 넣어주는 이유는 8..
-
[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번으로 이케저케 반복 작업을 통해 단어를 알아낸다. 위의 내용을 바탕으로 한 페이로드이다.