WARGAME 34

pwnable.tw calc write-up

statically linked 32bit 바이너리다. PIE가 안 걸려있다. 간단한 계산기 프로그램이다. timeout 걸어놓은 거 빼고 특별한 건 없다. 분석하면서 주석을 조금 달아놓았다. get_expr 함수로 expression을 입력받고 parse_expr 함수로 최종적으로 결과가 프린트가 된다. get_expr 함수이다. 화이트 리스트 기반으로 입력을 받는다. 공백 같은 문자들이 제거된다. 그리고 마지막에 NULL byte 하나 넣어준다. init_pool은 v1을 0으로 초기화해준다. parse_expr 함수의 일부다. division by zero를 막으려고 operand가 0이면 다 리턴한다. expression을 받아서 operator를 기준으로 operand를 int형 변수에 저장한다..

WARGAME/pwnable.tw 2022.08.23

pwnable.tw start write-up

받은 바이너리부터 IDA로 열어봤다. 바이너리 자체는 되게 간단하다. x86_32 syscall table 확인해보면 stdout에 출력하고, stdin을 read 해주는 간단한 바이너리라는 것을 알 수 있다. 바이너리 mitigation은 안 보인다. NX 안걸려있어서 execute 권한이 스택에 있다. 여기서 bof가 터진다. 처음에는 bof로 ret를 덮고, eip는 32비트니까 대충 NOP Sled 태워서 익스하려고 했다. 근데 0x3c라서 안 되겠다 싶었다. IDA를 다시 보니까 처음에 esp를 push 하는 게 보인다. 그래서 esp leak 하고 익스해야겠다고 생각했다. ubuntu20.04 로컬 환경에서 leak을 진행했다. push 이렇게 되니까, 0x18 만큼 덮으면 esp 전까지 덮인..

WARGAME/pwnable.tw 2022.08.20

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