System&Write up 87

[LeagueOfGuardians 2] register_you

[LeagueOfGuardians 2] register_you 바이너리는 64bit고 NX가 걸려있습니다. v6에 malloc으로 동적 할당을 하고 v6 + 3 (v6은 *형이고 64bit이기 때문에 +3은 +24임)에 hello 함수를 넣습니다. 즉, v6 + 3은 함수 포인터입니다. 그리고 이 함수를 1번 메뉴 register에서 호출하게 됩니다. 마침 바이너리에서 bonus 함수를 제공합니다. 저 함수 포인터를 bonus 함수의 주소로 바꿔주면 됩니다. bonus 함수의 주소 : 0x400806 자, 다시 main의 3번 메뉴를 보면 v6에 %s로 입력 검증 없이 받고 있습니다. dummy 값 24byte와 보너스 함수의 주소를 넘겨주면 될 것 같네요.

System&Write up/CTF 2018.07.24

[LeagueOfGuardians 2] FOR

[LeagueOfGuardians 2] FOR 바이너리는 32bit이고 NX가 걸려있습니다. main은 간단합니다. WriteReview 함수에 취약점이 있을 것 같네요. BOF 취약점이 발생합니다. s에 0x6C(108) + 4(SFP)만큼 dummy를 넣어주면 return address를 변조할 수 있습니다. puts_plt로 puts_got를 Leak하고, 제공된 libc를 통해서 puts의 offset을 구해서 빼주면 libc_base를 알아낼 수 있습니다. 그리고 puts 함수는 인자가 1개이기 때문에 pr(pop ; ret)을 구해야 합니다. pr : 0x08048379 puts_offset : 0x5f140 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19..

System&Write up/CTF 2018.07.24

[Codegate 2016] watermelon

[Codegate 2016] watermelon 32bit 바이너리이고, Canary와 NX가 걸려있습니다. 바이너리를 실행하면 우선 이름을 입력 받습니다. 그 후 옵션을 입력 받네요. 이름을 scanf %s 입력 제한 없이 bss 영역에 받고 있네요. 원할 때 가져올 수 있는 부분이니 생각해 둡시다. 그 뒤로는 4294967295 -> -1이 있고, 순서대로 1일 때 Add, 2일 때 View, 3일 때 Modify입니다. -1일 때는 어떤 역할을 할까요? 암호화를 해줍니다… 이름을 변경해주고 Add부터 봅시다. music과 artist를 추가할 수 있습니다. main에서 봤던 저 친구가 playlist에 몇 개의 음악이 있는지 나타내는 count이고, v1이 playlist를 저장하는 공간이었네요! ..

System&Write up/CTF 2018.06.03

[pwnable.kr] Rookiss - fsb

[pwnable.kr] Rookiss – fsb 문제는 32bit 바이너리입니다. 코드를 보면, key에 8자리 숫자를 가져옵니다. 그리고 alloca라는 함수를 사용해서 스택에 공간을 할당하고 fsb라는 함수를 호출합니다. fsb 함수는 이렇게 생겼는데요, 4번 fsb를 터트릴 수 있고, key를 입력하고 맞추면 쉘을 실행할 수 있습니다. fsb를 이용해서 key를 가져올 수 있을까요? 일단 한 번 디버깅 해보겠습니다. alloca 함수 때문에 fsb로 main 함수의 스택 공간까지 접근하기는 힘들 것 같습니다. fsb가 터지는 곳에 bp를 걸고 메모리를 보겠습니다. 스택에 보면 빨간 동그라미 값을 이용해서 화살표 메모리의 값을 변경할 수 있고, 그 변경한 값에 다시 접근해서 원하는 값으로 변경할 수 ..

[Codegate 2018] catshop

[Codegate 2018] catshop 32bit 바이너리이고, Canary와 NX가 걸려있습니다. main 함수의 코드는 이렇습니다. 숫자를 입력 받을 때, scanf %d, 혹은 read로 입력 받은 후 atoi로 변환하는 것이 아니라, 그냥 read로만 읽기 때문에 python을 이용해서 입력을 줘야합니다. 처음에 1과 2 메뉴로 8byte fastbin을 할당하고 해제할 수 있습니다. 1번 메뉴에서 할당한 주소에 mew~! mew~!를 print 해주는 함수 포인터를 저장하죠. 그리고 3번 메뉴에서 그 함수 포인터를 이용해서 함수를 호출하게 됩니다. 4번 메뉴에서는 이름을 바꿀 수 있는 함수가 있습니다. 여기서도 read로 읽어와서 malloc으로 할당해주고, 거기에 원하는 내용을 fgets ..

System&Write up/CTF 2018.04.08

[Codegate 2018] DaysNote

[Codegate 2018] DaysNote 바이너리는 32bit이고 보호 기법은 걸려있지 않습니다. 실서버 ASLR 또한 꺼져 있습니다. 연도와 내용을 입력 받습니다. 그리고 CountDays 함수를 통해서 그 연도의 일수를 return 하게 합니다. 여기서 윤년이 아니면 365일, 윤년이면 366일을 반환하게 됩니다. 그 후 일수만큼 입력 받았던 내용을 dest에 복사하게 되는데, 여기서 0x16D는 365기 때문에 윤년일 경우 1byte overflow가 일어납니다. 즉, FPO가 가능할 것 같네요. 쉘코드를 내용에 박고 SFP를 쉘코드가 박힌 주소를 가리키는 주소의 -4로 변조해주면 됩니다. 그리고 저 배열의 시작 주소를 가리키는 곳이 있으니 저 부분 -4로 SFP를 변조하면 될 것 같습니다. 1..

System&Write up/CTF 2018.04.08

[Codegate 2018] betting

[Codegate 2018] betting 64bit 바이너리이고, canary와 NX가 걸려있습니다. 그리고 바이너리에 기분 좋게 helper라는 쉘을 띄워주는 함수가 있습니다. 보시면 s는 bp-0x20에 있고 입력은 s에 0x28만큼 받습니다. v24가 canary이고 밑에 printf로 s를 출력해 주기 때문에 중간에 있는 NULL byte를 제거해주면 canary를 leak 할 수 있습니다. canary는 bp-0x8이니 s와의 거리는 0x18이(24)겠죠. 마지막 byte는 NULL일 것이니 s에 “A”*24를 sendline으로 넘겨주면 “A”*24+”\x0a”가 전달되면서 NULL byte가 덮일 것입니다. 1 2 3 4 payload = "A"*40 + p64(canary) + "A"*8..

System&Write up/CTF 2018.04.06

[pwnable.kr] Rookiss - echo1

[pwnable.kr] Rookiss – echo1 64bit 바이너리이고, 보호기법들이 모두 꺼져있는 걸 볼 수 있습니다. 실행을 하면 이름을 입력 받고, 메뉴를 출력합니다. 1번 BOF echo만 사용할 수 있습니다. 1번 menu인 echo1 함수입니다. s가 bp-0x20인데, 128byte나 입력 받기 때문에 BOF 취약점이 발생합니다. canary가 없어서 바로 return address를 덮을 수 있습니다. NX가 안 걸려있어서 shell code를 이용할 수 있습니다. ASLR 때문에 고정된 주소가 필요합니다. main의 일부분입니다. 이름을 입력 받고 4byte가 id라는 변수에 들어갑니다. 그리고 id는 bss 영역에 있죠. id에 jmp rsp를 넣고 return address를 id..

반응형