분류 전체보기 94

리버싱 10차시 과제

Prob-begin IDA로 디컴파일한 모습이다. v5에 16글자를 입력받는다. 그리고 16글자 4바이트씩 쪼개서 a1에 집어넣는다. stub에 따라서 다른 명령을 수행한다. stub의 모습이다. stub를 해석하는 프로그램을 작성했다. 위와 같은 결과를 얻을 수 있다. 32비트짜리라서 0xffffffff를 and 해줬다. initcpu 함수에서 아래와 같은 동작을 수행한다. v4[0] = v5[0] v4[1] = v5[1] v4[2] = v5[2] v4[3] = v5[3] v4는 총 8개가 존재하고 32비트이다. 일종의 레지스터 역할이다. 8개의 32비트 레지스터 중 4개가 사용자의 입력을 받아서 설정된다. 그 4개의 레지스터를 미지수로 설정한다. 그다음 v4[7] == 0이라는 조건을 만족시키는 미지..

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

리버싱 9차시 과제

prob for beginner 열어서 디컴파일 해보면, 이렇게 나온다. 식을 그대로 복사했다. 붙여넣고 &&랑 공백과 개행 문자를 다 없애줬다. 돌려보면 이렇게 나온다. 아까 돌려서 나온 식들을 그대로 복사 붙여넣기 해서 풀었다. print() 기본적으로 개행 문자가 붙어서 나가서, end =''로 개행 문자 없애고 출력했다. prob-1 디컴파일 해보면, 이렇게 나온다. if 문쪽 식을 그대로 복사하고 붙여넣어준다. 그다음 LL을 제거해주고, 보기 좋게 만들어주고 프린트해보면 아래처럼 나온다. 이거 그대로 복사하고 풀어주면 된다. 여기선 8 바이트 v4, v5, v6로 표현되었지만, scanf가 %s로 v4부터 받아서 v5, v4 순서대로 출력해주면 된다. 나온 걸 string으로 만들어주면 리틀엔디..

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