leesu0605 102

Layer7 포너블 2차시 과제 - basic_exploitation_000 풀이

일단 C언어 코드가 들어있는 파일을 VSC로 열어보았다. 이와 같은 코드가 나오는데, 잘 보면 buf의 길이는 128이지만, 입력받는 길이는 141바이트인 걸 볼 수 있다. 또, buf의 주소도 있기 때문에 buf에 쉘코드를 넣고, main의 ret주소를 buf의 주소로 변조하면 쉘을 따낼 수 있을 것이다. 한 번 페이로드를 구성해보자. 이렇게 (쉘코드와 dummy값으로 buf와 sfp까지 = 배열의 크기 : 128 + sfp : 4 = 132) 채우고, buf의 주소로 ret를 변조해 main함수가 리턴될 때 eip를 쉘코드로 옮겨 쉘을 따내도록 실행 흐름을 조작했다. 한번 실행해보자. 이렇게 쉘이 따지고 플래그도 출력된 걸 볼 수 있다. flag : DH{465dd453b2a25a26a847a93d3..

system hacking 2022.09.21

Layer7 포너블 2차시 과제 - overwrite_ret64 풀이

일단 파일을 다운받아 아이다로 열어보았다. overwrite_ret32와 코드는 같았고, 아까처럼 buf address를 입력받아 파싱해주고, size에 페이로드의 길이를 입력해준 후, ret 주소를 변조할 페이로드를 보내주면 풀리는 문제 같았다. 그러나, 64비트이기 때문에 buf address의 길이가 많이 다르다. 아까는 4바이트로 출력됐지만, 이번엔 6바이트로 출력된다. 따라서 파싱 부분의 코드를 조금 바꿔주면 이 문제는 해결할 수 있다. 또, sfp와 ret 주소가 각각 4바이트에서 8바이트가 되므로, 264가 아닌 272를 입력해야 페이로드를 입력할 수 있다. 따라서 size를 입력받을 때 272를 보내주면 된다. 마지막으로 주소를 p32가 아니라 p64로 패킹해 보내주면 공격이 먹힐 것이다...

system hacking 2022.09.21

Layer7 포너블 2차시 과제 - overwrite_ret32 풀이

일단 문제 파일을 다운받아 아이다로 열어보았다. 보아하니, 처음에 buf char형 배열의 주소를 출력하고, 몇 바이트를 입력받을지 nbytes에 받아낸 후 그 바이트만큼 buf에 입력받을 수 있게 해주는 프로그램 같았다. 그러나 nbytes의 크기에 제한이 없기 때문에 buf의 크기보다 훨씬 더 많은 양의 내용을 입력할 수 있었다. 그러므로 우린 256바이트의 dummy값 + 4바이트의 sfp값 + 4바이트의 변조할 주소를 입력하면 main의 ret주소를 변조해 main이 리턴될 때 특정 위치로 eip를 이동시킬 수 있다. 이를 구현한다면, 1. 첫 줄에 출력하는 buf address 를 파싱을 통해 구해준다. 2. 페이로드의 길이를 size 에 입력한다(여기선 264를 넘겨주면 된다). 3. 쉘코드와..

system hacking 2022.09.21

Layer7 포너블 2차시 과제 - prob1 풀이

일단 파일을 내려받아 아이다로 열어보았다. bss 세그먼트에 있는 name변수에 첫번째 문자열을 입력받고, s에 gets로 두번째 문자열을 입력받고 있다. 일단 스택부터 살펴보자. 문자열 s에 gets 함수를 통해 입력받고 있는데, 길이 제한이 없으므로 main의 ret 주소를 오버플로우 시킬 수 있다. 따라서 20바이트의 배열 + 4바이트의 sfp + 4바이트의 ret 로 페이로드를 날리면 ret 주소 오버플로우가 된다. 그런데 쉘을 실행시켜주는 함수가 함수 리스트에 존재하지 않는다. 이럴 땐 어떻게 해야될까? 바로 쉘코드를 어떤 위치에 직접 주입해서 함수가 리턴될 때 eip가 그 주소로 가도록 조작하는 방법을 쓰면 된다. 따라서 name 배열에 쉘코드를 주입하고, 리턴 주소를 name의 주소로 변조하..

system hacking 2022.09.21

Layer7 포너블 2차시 과제 - change_ret64 풀이

일단 파일을 아이다로 열어 C로 디컴파일 해보았다. 32비트 버전과 main함수는 같았고, vuln 함수로 들어가보았다. vuln 함수도 32비트 버전과 같았고, s의 길이만 달라졌다. 또, win 함수도 있으므로 전 문제와 똑같이 vuln에서 s에 입력받을 때 배열 길이보다 훨씬 더 많은 길이의 문자열을 입력받는다는 취약점을 이용해 ret주소를 win 함수 주소로 변경하면 된다. 한 번 페이로드를 구성해보자. 32바이트 배열+8바이트 sfp까지 dummy값으로 채웠다. 그 후, win함수의 주소를 p64로 패킹해 덧붙여주었고, 이는 vuln의 ret 주소에 들어가게 된다. 다만, win의 주소에 1을 더해서 넣어준 걸 볼 수 있는데.. 이는 system 함수와 관련 있는 오류 때문이다. system 함..

system hacking 2022.09.21

Layer7 포너블 2차시 과제 - change_ret32 풀이

파일을 다운받아 아이다로 열어보았다. vuln이라는 함수가 보여 거기로 들어가봤다. 20바이트짜리 s 배열을 선언해줬고, 입력을 받고 있었다. 그러나, 배열의 크기는 20바이트인데, fgets에선 80바이트만큼 입력받고 있었고, 여기서 취약점이 터진다는 사실을 알아냈다. 다른 코드 로직이 보이지 않는 걸로 보아 vuln 함수의 ret 주소를 변조해 vuln에서 리턴할 때 쉘을 실행시키는 함수로 이동해야하는 것 같았는데, 마침 win이라는 수상한 함수가 보였다. 그래서 내용을 확인해보니, 역시 쉘을 실행시키는 코드가 탑재되어 있었다. 따라서 win의 주소값으로 vuln함수의 ret주소를 변조하면 문제가 풀릴 것이다. win의 주소값은 어셈블리어 코드로 변환해 구했다. 한 번 페이로드를 구성해보자. send..

system hacking 2022.09.21