WARGAME/pwnable.kr 6

pwnable.kr passcode write-up

접속해서 코드를 읽어봤다. 바이너리를 실행시켜보면, segmentation fault가 난다. 문제에서 compiler warning이 떴는데 무시했다고 한다. 그래서 로컬에 하나 만들어서 컴파일 해보았다. 보면 &가 빠져있다. 주소를 쓰는 게 아니라 값을 주소처럼 써버려서 segmentation fault가 나는 것 같다. 만약 이때 passcode1의 값을 변조할 수 있다면, 임의 주소에 마음대로 쓸 수 있다. PIE가 걸려있지 않고 Partial RELRO가 걸려있다. 카나리가 있으니 welcome 함수에서 bof를 터뜨려서 ret를 변조하는 것을 힘들어 보인다. base가 고정이라서 원하는 곳으로 eip를 변조하기 수월하고, Partial RELRO가 걸려있으니 got를 덮는 것을 고려해볼 수 있..

WARGAME/pwnable.kr 2022.08.16

pwnable.kr bof write-up

문제가 준 링크로 들어가서 소스 코드랑 바이너리 파일을 받을 수 있다. gets로 받아서 key라는 파라미터를 0xcafebabe로 바꾸면 된다. bof 바이너리를 gdb로 확인해보면 cmp에서 ebp+0x8과 0xcafebabe를 비교한다. rbp+0x8부터 4바이트 덮으면 된다. 그 바로 위에 확인해보면 버퍼는 ebp-0x2c인것을 알 수 있다. (ebp+0x8) - (ebp-0x2c) = 0x34니까 0x34만큼 아무거나 덮고, 4바이트 0xcafebabe로 덮으면 된다. x86이라서 p32를 썼다. p32는 32비트 리틀엔디안으로 패킹해주는 함수다.

WARGAME/pwnable.kr 2022.08.15

pwnable.kr collision write-up

접속하면 col이랑 col.c, flag가 보인다. flag는 당연히 권한이 없어서 못 읽는다. col.c를 읽어보면, argv[1]로 받은 20바이트를 4바이트 int로 쪼개서 res에 더하는 것을 알 수 있다. res가 0x21dd09ec면 된다. 편하게 0x21dd09ec를 5로 나눠서 조건을 만족하게 만들어주면 된다. 나머지가 4니까 나중에 더해주면 된다. int로 쪼갤때마다 6c5cec8을 만족하면 조건문을 통과할 수 있다. 그리고 마지막에 나머지를 더해주면 hashcode와 같아진다. 0x6c5cec8을 리틀 엔디언으로 변환해주면, \xc8\xce\xc5\x06가 되고, 이걸 내게 복붙 한 다음, 마지막에 4를 더해주면 된다. \xc8\xce\xc5\x06\xc8\xce\xc5\x06\xc8\..

WARGAME/pwnable.kr 2022.08.15

pwnable.kr fd write-up

ssh로 접속을 해보면 fd, fd.c와 flag가 있다. flag는 읽어보면 권한이 부족해서 읽을 수 없다. fd 바이너리에 fd_pwn으로 setUID가 걸려있다. fd.c를 읽어보면 command line argument 받아서 그 fd에서 0x1234를 빼서 읽고, LETMEWIN\n이면 flag를 읽어준다. proc 먼저 확인해보려고 들어갔는데 거부됐다. 그래서 ps도 안 먹힌다. /dev/fd를 들어가면 현재 프로세스의 fd를 확인할 수 있다. /dev/fd는 /proc/self/fd의 심볼릭 링크가 걸려있다. stdin, stdout, stderr인 0, 1, 2가 보이고, 다른 fd가 보인다. 여기서 이 프로세스의 fd를 확인할 수 있다. 파일에 LETMEWIN\n을 쓰고, ~/fd한테 그..

WARGAME/pwnable.kr 2022.08.14