본문 바로가기

Wargame Write-Up141

[Lord of SQLI] gremlin, cobolt, goblin, orc, wolfman 풀이 gremlin pw=' or '1 id 신경안쓰고, pw 조건문만 참으로 만들어주면 된다. cobolt select id from prob_cobolt where id='admin' or '1=1' and pw=md5('') pw 를 md5 해쉬해서, 아까와 같은 방법으로는 sqli 할 수 없다. 그래서 아이디 부분을 참으로 만들고, 주석처리해서 뒷부분을 무시하게한다. id=admin' or '1=1# goblin select id from prob_goblin where id='guest' and no=1 or id=0x61646d696e 쿼터, 더블쿼터를 쓸 수 없다. 하지만 no 를 입력받는 부분에는 쿼터가 사용되지 않아 우회할 필요가 없다. no=0 이면, guest 가 출력되니, 1 로 준다음,.. 2021. 5. 25.
[HackCTF] (Pwnable) babyfsb 풀이 printf(buf) 부분에서 fsb 가 발생한다. buf 값의 입력가능 범위는 SFP 전까지이다. 리턴주소 ( __libc_start_main + 2XX ) 을 leak 하면서, 카나리 부분을 덮은 뒤, ___stack_chk_fail@got 을 main 함수로 덮는다. 2라운드 에서는, leak 한 주소를 바탕으로 ___stack_chk_fail@got 을 원샷 함수로 덮거나, printf@got 을 system 으로 덮은 다음, 카나리 부분을 덮은 뒤, buf 에 "/bin/sh" 를 입력해서 printf(buf) -> system("/bin/sh") 실행 일단 rsp + 6번째가 buf 의 값을 나타낸다. 프로그램을 실행하고, __stack_chk_fail@got 을 보면, 아직 호출된 적이 없기.. 2021. 5. 14.
[HackCTF] (Pwnable) Unexploitable_4 풀이 마지막시리즈다. 보호기법은 NX 가 꺼져있다. bss 에 쉘코드를 적어서 리턴하면 될텐데, dummy+sfp+ret 합쳐서 0x20 byte 여서 ret 넘어서 입력받을 수 있는 데이터는 13byte밖에 되지 않는다. 13byte 짜리 쉘코드는 찾아봤는데 없는 것같다. 그래서 23byte 쉘코드를 스택피보팅으로 나눠서 입력해보자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 from pwn import * # r=process("./Unexploitable_4") r=remote("ctf.j0n9hyun.xyz", 3039) context.log_level='debug' bss=0x601000+0x800 .. 2021. 5. 3.
[HackCTF] (Pwnable) Unexploitable_3 풀이 보호기법은 2와 마찬가지로 NX 정도 걸려있다. main 함수에서 0x90 만큼 오버플로우가 발생한다. gift 함수에는 fwrite 함수가 있는데, 밑부분을 보면, mov rcx, [rdi] 가젯이 있는데, 이걸로 fwrite 의 4번째 인자를 조작할 수 있다. fwrite(fgets@got, 1, 6, 0x601050 (stdout in bss)) 이렇게 호출하면 되는데, rdi, rsi, rdx 레지스터는 __libc_csu_init 가젯으로 맞추면 된다. pop rdi 가젯으로 rdi 에 bss 주소 넣기 mov rcx, [rdi] 가젯으로 rcx 에 stdout 이 들어가게 된다. 이제 csu 가젯으로 rdi, rsi, rdx 가젯을 세팅하고, fwrite 로 leak 을 한다. 다시 main .. 2021. 5. 3.