[译]linux使用软连接读取本地文件

作者通过实验展示了如何利用Facebook平台上传各种恶意文件,并详细记录了上传过程及响应结果,包括php文件、软链接到/etc/passwd等。
原文地址:[url]http://josipfranjkovic.blogspot.com/2014/12/reading-local-files-from-facebooks.html[/url]
前提条件:可以上传任意后缀文件。首先尝试上传php文件,没有被执行,但是文件内容却在base64解码之后被返回了。
接下来我尝试将我的文件命名为"/etc/passwd", "file:///etc/passwd",但是都没成功。
然后,我上传了一个zip压缩的php文件,返回unzipped的base64编码的文件,于是尝试上传一个软链接到/etc/passwd:
1. 创建软连接
ln -s /etc/passwd link
2. 压缩软连接
zip --symlinks test.zip link
3. 上传test.zip,系统会unzip它
4. POST的相应会含有/etc/passwd:
[img]http://dl2.iteye.com/upload/attachment/0105/5589/6032e253-ec9c-341a-b23d-7cc25990ef70.png[/img]
### 3.1 文件读取与数据解析 在Linux环境下使用C++从本地读取G.711格式音频文件时,通常需要处理的是原始二进制格式的`.g711`文件。这类文件没有头信息(header),仅包含压缩后的音频数据流。因此,必须确保以正确的采样率(通常是8kHz)和编码方式(PCMU或PCMA)进行解析。 以下是一个基于C++标准库的文件读取实现: ```cpp #include <fstream> #include <vector> std::vector<uint8_t> ReadG711File(const std::string& filename) { std::ifstream file(filename, std::ios::binary | std::ios::ate); if (!file.is_open()) { // 错误处理 return {}; } std::streamsize size = file.tellg(); file.seekg(0, std::ios::beg); std::vector<uint8_t> buffer(size); if (file.read(reinterpret_cast<char*>(buffer.data()), size)) { return buffer; } return {}; } ``` 该函数将整个音频文件内容读入一个`std::vector<uint8_t>`中,便于后续操作。 ### 3.2 配置WebRTC音频源 为了将G.711音频数据注入到WebRTC音频流中,需创建自定义音频源类并继承`webrtc::AudioTrackSourceInterface`接口。此类负责提供音频帧数据,并告知WebRTC其采样率等基本信息。 示例代码如下: ```cpp class G711AudioSource : public webrtc::AudioTrackSourceInterface { public: explicit G711AudioSource(const std::vector<uint8_t>& audio_data) : audio_data_(audio_data), current_pos_(0) {} rtc::Optional<int> GetPreferredSampleRate() const override { return 8000; // G.711 typically uses 8kHz sampling rate } bool is_silent() const override { return false; } void OnData(rtc::ArrayView<const int16_t> audio_data, int sample_rate_hz, size_t bytes_per_sample, size_t channels) override { // 可在此处转发PCM数据(若已解码) } private: const std::vector<uint8_t> audio_data_; size_t current_pos_; }; ``` 该类目前仅支持提供元信息,尚未实现音频帧的实际生成逻辑。 ### 3.3 创建音频轨道并添加至PeerConnection 一旦音频源构建完成,即可通过`webrtc::AudioTrack::Create()`方法创建音频轨道,并将其绑定到`PeerConnection`中用于传输。 ```cpp rtc::scoped_refptr<webrtc::AudioTrackInterface> CreateG711AudioTrack( rtc::Thread* worker_thread, const std::vector<uint8_t>& audio_data) { rtc::scoped_refptr<G711AudioSource> source = new rtc::RefCountedObject<G711AudioSource>(audio_data); return webrtc::AudioTrack::Create(worker_thread, "g711_audio_track", source); } // 使用示例 auto g711_track = CreateG711AudioTrack(worker_thread, audio_data); peer_connection->AddTrack(g711_track, {}); ``` ### 3.4 设置编解码器偏好 如果希望强制使用G.711编码进行传输,可以在建立连接前设置RTP编码参数,指定使用PCMU或PCMA编码。 ```cpp webrtc::RtpEncodingParameters encoding; encoding.codec_payload_type = 0; // PCMU payload type encoding.ssrc = 123456; webrtc::RtpTransceiverInit init; init.send_encodings.push_back(encoding); peer_connection->AddTransceiver(webrtc::MediaStreamTrackInterface::kAudioKind, init); ``` WebRTC 的音频部分,包含设备、编解码(iLIBC/iSAC/G722/PCM16/RED/AVT、NetEQ)、加密、声音文件、声音处理、声音输出、音量控制、音视频同步、网络传输与流控(RTP/RTCP)等功能[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值