전체 글 289

RTL Chaining (esp lifting technique)

RTL 체이닝에 대해서 알아보겠습니다~ RTL Chaining에 대해 알아보자. 일단 RTL Chaining​은 ESP Lifting gadget과 관계있다. 이름 그대로 ESP를 움직이는 것이다. POP RET POP POP RET POP POP POP RET ... 위 3가지는 esp lifting을 하게끔 해주는 어셈블리 코드(가젯)들이다. pr, ppr, pppr 이라고도 부른다. (통칭 ppr 로 하겠음) ppr을 이용하면 함수를 연쇄적으로 호출할 수 있게 된다. 그 말인 즉, RTL을 연쇄적으로 할 수 있다는 말이다. 역시 말로하면 이해가 잘 가지 않으니 그림을 그려서 정리해보도록 하겠다. 간단하게 설명하자면 pop-pop-ret 가젯을 이용하여 esp를 컨트롤 하는 것이다. 최초에 RTL 함..

Frame Pointer Overwriting

프레임 포인터 오버라이팅 기법에 대해 알아보자. fake ebp 하위 개념이라고 생각하면 된다. 프레임 포인터 오버라이팅은 RET 위로 덮어쓸 수 없을 때, 1바이트 오버플로우가 가능하다면 공격이 가능한 기법이다. 흔히 1byte overflow 라고도 한다. 하지만 조건이 있다. 1. 1바이트 오버플로우가 일어나야 한다. 2. 메인함수 외에 서브함수가 반드시 필요하다. 그럼 프레임 포인터 오버라이팅에 대해 알아보자. 문제점이 생기는 소스코드를 예제로 하나 보여주지. function(char *arg) { char buffer[80]; int count; for(count=0;count 2번째 그림 : leave 명령이 수행되어 ebp는 '??' 즉, 알 수 없는 주소로 떠내려간다. 2번째 -> 3번째 ..

Fake EBP

Fake ebp (가짜 ebp) 기법에 대해 언급하려 한다. 들어가기 이전에, 머리에 상당히 쥐가 날 수 있다는 점.. 늘 새로운 기법을 공부할 때면 사용 가능한 환경과 이유가 있겠지? fake ebp 기법은 언제쓸까? RET 이후로 덮어쓸 수 없을 때, 그리고 RET 자리에 스택 이나 라이브러리 주소를 필터해놓았을 경우 이다. 이런 경우에 RET에서 원하는 위치로 eip를 뽑아내야 하는데, 그렇지 못하다. 그래서 ebp위치를 옮겨 우리가 원하는 위치에서 원하는 RET를 뽑아내는 것이 Fake ebp 기법이다. 간단하게 말하자면. fake ebp는 함수의 에필로그가 핵심이다. leave와 ret 이놈들. 알다시피 leave ret 은 명령어를 해부하면 아래와 같다. 결론적으로 말하자면 에필로그를 이용해서..

RTL(bypass NX-bit, ASCII Armor)

저번 포스팅에서 RTL을 한건 NX-bit를 우회하는 기본적인 RTL에 대해 언급했었다. 근데 여기서 아스키아머가 적용되었을 때 RTL 공격을 하는 법을 알아보자. 아스키 아머가 적용되면 SYSTEM 함수 라이브러리 주소의 최상위 1바이트가 NULL로 바뀌는데 strcpy 등으로 페이로드가 복사될 때 null 때문에 함수 호출한 후 페이로드 뒷부분이 전달이 되지 않으므로 함수의 인자값을 직접 대입하여 변조하는 것은 불가능하다. 그렇기 때문에 쓰레기값 심볼릭 링크를 하는 RTL 즉, 오메가 프로젝트를 사용한다. 근데.. 접때도 설명했듯이 argv 자리에 있는 값은 스택영역에 있다. 아스키 아머가 걸려 있으면 적어도 페도라 코어3은 될텐데. 거기엔 또 랜덤 스택이 적용되어 스택주소는 계속 해서 바뀐다. 그렇..

RET Sled

ASCII Armor로 인해 RTL 공격이 막히는건 저번에 설명했따. 그럼 해결책이 없는 것인가. RET Sled 즉, RET 썰매를 이용하면 된다. 간단하게 설명해 NOP Sled와 비슷한 맥락인데, RET을 연쇄적으로 호출하여 스택상의 위치를 계속 위로 옮기는 작업이다. 이게 아스키 아머랑 뭔 상관이 있는가. 아스키아머가 적용되어있으면 페이로드에 인자를 구성해서 올릴 수가 없다. 이 상황에서 인자값을 변조시키고 싶다면 스택상의 함수의 실행 위치를 옮기면 되지 않겠는가. 그 때 필요한 테크닉이 RET Sled 원리는 간단하다. 어셈블리 RET 명령어를 이용하는 것이다. 리턴 어드레스의 RET가 아니라 어셈 명령어 RET RET 명령은 두가지로 구성된다. pop eip jmp eip 다음 실행될 명령을 ..

반응형