V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  geelaw  ›  全部回复第 147 页 / 共 172 页
回复总数  3428
1 ... 143  144  145  146  147  148  149  150  151  152 ... 172  
2017-06-24 21:50:10 +08:00
回复了 guyeuro 创建的主题 问与答 黑客是如何利用所谓的“进程内存转储”偷密码的?
@wevsty 最开始有 GC,所以假定不是自己管理内存 - - 如果是 C/C++ 那就没这个问题了,毕竟可以自己控制。
@Tunar ?(亚洲人问号)这篇文章和大素数的关系是啥?
2017-06-24 21:09:53 +08:00
回复了 guyeuro 创建的主题 问与答 黑客是如何利用所谓的“进程内存转储”偷密码的?
@wevsty String 是不可变,且 String 是 final,因此这条路走不通。

而且一个程序不可以依赖 finaliser 来做清理,因为在内存足够的硬件上,GC 可以选择永远不回收内存。
@fucker

> 回复语气太正式

实际上是因为表述方式太形式化(“下面四个命题有一个是真的”是经典成语 TFAE 的变体)

> 冒犯

并不算是冒犯,但是一个我觉得不礼貌的行为不是非要引起别人的不适。第一次见这个的人当然没有恶意,我只是对这个感觉 fed up。

> 挺伤人的一个词

取决于用法,这个词(在普通话里)似乎本身还没有太明显的感情色彩

> 区别巨大

主要原因是第一个音节的复印是很不同的(英语 dʒ、汉语拼音 j 和粤语拼音 k 的区别真的很明显),第二个音节的元音的区别也很大

> 例子

这两个例子中,两个语言中发音的差别都很大,因为一个语言里可以存在另一个语言里面没有的音。

> 挑刺

因为我的书写是追求准确的 - - 这并不是玩笑。
2017-06-24 20:31:15 +08:00
回复了 guyeuro 创建的主题 问与答 黑客是如何利用所谓的“进程内存转储”偷密码的?
@nevin47 你的想法有很多值得二次思考的地方……比如为什么再次加密后破解难度指数增加?用于二次加密的密码存放在哪里?如果也在进程内存,只要读出二次加密的密码再解密私钥密文不就行了?
2017-06-24 20:19:38 +08:00
回复了 hoythan 创建的主题 问与答 评论数组快速归类的方法
@geelaw 果然写错了,二分查找的部分应该是 inputArray。另外实际上可以用 sparse array 来做这件事情,不需要二分查找。
2017-06-24 20:18:12 +08:00
回复了 guyeuro 创建的主题 问与答 黑客是如何利用所谓的“进程内存转储”偷密码的?
@ech0x 不能,只要你的程序能做的,能控制你的程序的程序都能做。
2017-06-24 20:17:24 +08:00
回复了 hoythan 创建的主题 问与答 评论数组快速归类的方法
/* in-place, destructive */
function treefy(inputArray)
{
var outputArray = [];
inputArray.forEach(function (comment) { comment.comments = []; });
inputArray.sort(function (a, b) { return a.commentID - b.commentID; });
var helper = function (begin, end, n)
{
if (begin >= end) return null;
var mid = (begin + end) >> 1;
var testee = outputArray[mid].commentID;
return testee < n ? helper(begin, mid, n) : testee > n ? helper(mid + 1, end, n) : outputArray[mid];
};
inputArray.forEach(function (comment)
{
if (comment.comment_parentID == 0) outputArray.push(comment);
else helper(0, inputArray.length, comment.comment_parentID).comments.push(comment);
});
return outputArray;
}

没有测试过, provided as-is.
2017-06-24 20:09:23 +08:00
回复了 guyeuro 创建的主题 问与答 黑客是如何利用所谓的“进程内存转储”偷密码的?
实际上可以直接用 Process Explorer 查看进程里面长得像字符串的东西,这也是可能看到密码的。


@ech0x 但是 char[] 是可变的,因此你可以用完之后手动填充为空白。这样做是为了保证用完之后内存里不再有这个串。

然而很糟糕的是,对于复制 GC 这一招还是会被攻击。


@nevin47 如果没有解密私钥的密码怎么解密私钥……?而且要用的时候仍然需要把私钥解密。
2017-06-24 20:03:36 +08:00
回复了 1oNflow 创建的主题 程序员 回复邮件的标题该怎么写?要不要附带每次对话原文?
正确的实现是,如果标题以任何语言的“回复”“转发”加上冒号开始,则先去掉,看作标题,然后加上当前语言的“回复”“转发”和冒号。

在回复邮件的时候带上全文是正确的,一些客户端具有“打开对话中一条消息”的功能,如果你不加上全文就会导致读对话很麻烦;一个聪明的移动客户端也会在阅读对话的时候自动隐藏引用内容(对于桌面客户端,没这个必要,因为一个对话里面的邮件不是摞在一起的,而是左边有个列表让你选)。
2017-06-24 19:32:31 +08:00
回复了 wangzhangup 创建的主题 站长 .ai 的域名怎么注册
@tony1016

Euh... 深入浅出 和 太深 似乎不矛盾 - - 原文末我有一个简单的总结的:

> 所有在开始使用算法之前固定的东西都应该当成并且需要公开。

另外这篇文章并不深,这个内容应该是二年级的感悟,我都快四年级了。
@SuperMild 那你没有理解我想表达的——因为从样子上看你可以把“算法”写进“密钥”,比如我提到用 UTM,密钥是两对算法,这样这句话就不直觉成立了。

这篇文章的主要目的是解决什么属于这个语境里面的“算法”(需要保密的东西)。
@momocraft
@fucker

下面四个命题有一个是真的:

- 英语发音错误;
- 汉语发音错误;
- 没有把域名用英语读;
- 说的不是普通话或者粤语。

Gee Law,普通话的“基佬”和粤语的“基佬”的发音都有巨大区别,不可能弄错。

英语 Gee Law /dʒiː lɔː/

普通话 基佬 /tɕi1 lɑʊ̯3/

粤语 基佬 /keɪ̯1 lɤʊ̯2/


对别人的名字品头论足是一件很不礼貌的事情;即使最初我觉得这个解释很有趣,我也会觉得厌倦——这个梗已经存在至少 7 年了。
2017-06-24 19:09:03 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@bp0

这个方法的可移植性 和 程序的可移植性 没什么关系,因为这个玩意儿是给 **调试** 用的。正常使用(而不是调试程序)的时候不会应用这个策略。

这里的“让它 crash ”是在调试阶段暴露问题,在生产阶段,因为一些优化的考虑,不可能做这么多防御措施。

如果你在书写可移植的代码,那么你可以在一个有这个调试功能的平台上完成调试之后到其他平台用。


@VYSE

(所以 0xdeadbeef 不能 mmap ?我不用 *nix 不太懂。)


@VYSE
@wind3110991

如果有两个指针指向同一个动态分配地址,那么仅仅设置一个指针为 nullptr 或者一个特殊的数是没有用的。

这种情况或许容易检测,但是更困难的是,你分配了一个数组,两个指针一个指向数组开头,一个指向数组里的另一个位置,然后你 free 数组开头并重置指针——这样虽然后一个指针并不等于被释放的指针,仍然变得无效。
2017-06-24 00:31:40 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@bp0 因为在这个模式下,如果你释放内存,整个 page 都会变得 invalid,就好像这个 page 从没用到过一样(但是 heap manager 会避免过早再次使用这个 page )。

举个例子,第一次分配 1 Kb,记在 p 里面,第二次又分配 1 Kb,记在 q 里面,假设第二次分配的那 1 Kb 在第一次后面那一个 page。

做这个:free(q); printf("%c\n", *q);
相当于:free(q); printf("%c\n", *(p + PageSize));

把 q 释放之后访问 q,是访问无效的 page,这里效果上等于 p buffer overrun,是会被检查到的。

至于一个 page 具体是怎么被 decomitted 的,这我并不关心。

**此外,free 掉一个指针之后设置为 nullptr,不代表原来其他指向它(或者这个数组其他位置)的指针也变成了 nullptr。**

如果你可以把所有和这块内存关联的指针都找到并设置为 nullptr,那恐怕是可以的——但是这样的入侵性很强,还有可能让你不知道什么时候一个指针就被篡改了。

至于一个 malloc 的实现可以抵抗双重释放,不代表书写双重释放的代码是可以接受的——这样的代码不可移植,而且在地址被重新利用的时候会引发更加糟糕的错误。彻底解决的方法是杜绝程序有逻辑问题,而不是掩盖这个问题。

扩展阅读
https://stackoverflow.com/questions/1879550/should-one-really-set-pointers-to-null-after-freeing-them
https://stackoverflow.com/questions/1025589/setting-variable-to-null-after-free
2017-06-23 23:52:18 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@tyfulcrum 取决于逻辑,不能一概而论,所以我说“任何情况(也就是不考虑具体情况)都在 free 之后立刻设置为 nullptr ”是不好的。
2017-06-23 23:50:37 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@bp0 如果你认真读了那篇内容你会发现释放之后再访问也会出错,因为页面已经被 decomitted。这是一个调试功能,所以效率低一点并没有什么问题。

双重释放会导致堆损坏,而且双重释放是会导致访问已经释放的内存的——比如第一次释放后那个地址被分配给别人之后再第二次释放,实际拥有者不知道这个内存已经被扔了,再次访问就会有坏事发生。
2017-06-23 22:49:28 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@bp0 如果你开启页末对齐,则你并不需要赋值为 nullptr 也能看出错误。参考 https://blogs.msdn.microsoft.com/oldnewthing/20170410-00/?p=95935

如果你设置为 nullptr,你就没法发现双重释放的错误。
2017-06-23 21:42:01 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@catror 没有区分 dangling pointer 和 uninitialised pointer 的必要——它们都存储着无效的值。
1 ... 143  144  145  146  147  148  149  150  151  152 ... 172  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2433 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 49ms · UTC 14:21 · PVG 22:21 · LAX 07:21 · JFK 10:21
Developed with CodeLauncher
♥ Do have faith in what you're doing.