시스템 해킹 5

[pwnable.kr] dragon

이 문제는 type error와 uaf 취약점 2개를 이용해서 푸는 문제였다. main함수에서 PlayGame() 함수로 넘어가보자 FlightDragon 함수랑 SecretLevel 함수가 보인다. 이 함수로 넘어오면 shell을 실행할 수 있는데, 입력한 문자열과 Nice_Try 부분 문자열이 일치하는지 확인함, 근데 10글자밖에 못가져와서 이 부분은 사실상 의미가 없었다. 하지만 system("/bin/sh")를 실행하면 쉘이 실행될테니 해당 주소를 기억해두자 SecretLevel 함수를 확인해보면 0x08048dbf 함수에서 부터 system("/bin/sh") 함수가 실행되는 것을 알 수 있다. 이번엔 FlightDragon 함수 로직을 파악해보자. 간단하게 확인해보면 캐릭터를 생성해서 용이랑 ..

[pwnable.kr] Collision

20byte를 받아서 check_password함수에서 정수형 포인터를 통해 4바이트씩 읽어서 더하는 것을 알 수 있었음 끝에서 hashcode랑 비교를 하게 되는데, 0x21DD09EC랑 일치해야 플래그 값이 출력됨 0x21DD09EC를 임의로 5등분 하게 되면, 이런식으로 나옴 06C5 CEC8 / 06C5 CEC8 / 06C5 CEC8 / 06C5 CEC8 / 06c5 CECC 그러면 이걸 더해서 20바이트 맞춰주면 될거라 생각함 근데 여기서 뻘짓 했던게 ascii 테이블에 있는 문자로 치환해서 넣어야 겠다라고 생각해서 조금 뻘짓을 하게됨.. 일단 어셈블리 상으로 보면 check_password+39 부분에서 ebp-0x8에 eax를 다 더하고 나중에 그 값을 eax로 옮긴 뒤 리턴하는 것을 볼 수..

[pwnable.kr] fd

fd에 대해서 알고 있는지 물어보는 문제 read를 통해 buf에 할당하고 있는데, fd를 0으로 맞춰줘야함 그렇다면 read함수의 fd를 0으로 맞춰주면 됨 fd는 첫번째 인자에서 0x1234를 빼게됨 그럼 인자에 0x1234(10진수: 4660)를 주게되면 fd가 0으로 할당되고, buf에 값을 할당 가능 buf에 값을 LETMEWIN으로 맞춰주면 플래그가 출력됨 4660 입력 후 LETMEWIN 입력하니까 플래그 출력!

[DreamHack] oob1

idx의 범위 제한 로직이 없기 때문에 해당 idx에 큰값을 주어서 name쪽으로 넘어가면 될것이라 생각 일단 처음에 가장 중요한 name, command의 시작주소를 알아보자 name 시작주소: 0x804a0ac command 시작주소: 0x804a060 scanf에서 eax를 입력받는걸 알 수 있음 eax*4 + 0x804a060 → 즉 eax는 idx값이고, 현재 32비트이기 때문에 4바이트씩 증가 되면서 인덱스를 맞추는 것으로 볼 수 있음 그러면 name의 주소에서 command의 주소를 빼면 거리차이가 있을 거고 4바이트로 나누게 되면 idx를 추측할 수 있음 거리차이: 0x4C → 10진수: 76 76/4 = 19 즉 command의 19번째가 name의 시작임 익스플로잇 짜는 과정에서 nam..

[DreamHack] SSP01

BOF가 터지는 부분에 대해서 조금씩 보다가 print_box 함수를 통해 canary값을 가져올 수 있을것이라 판단했다. 또한, box, name, select 버퍼가 있기 때문에 마지막 case 'E' 선택 후 name 버퍼를 채워주어서 ret를 변조해 get_shell()을 불러오면 될거라 생각했다. gdb를 사용해 canary 위치를 확인해보니 [ebp-0x08] 인것을 확인할 수 있다. 그러면 box 시작부분부터 canary가 얼마나 떨어져 있는지 확인해서 idx를 통해 한바이트씩 출력시켜서 canary 값을 확인할 수 있다. lea eax, [ebp-0x88]을 통해서 box의 시작부분이 ebp-0x88부터 인것을 알 수 있음 buf 시작주소: 0xffffcf80 canary 시작주소: 0xf..